LINQ to XML学习笔记

时间:2022-01-05 20:55:07

之前了解过一点XML文件解析,断断续续看过各种各样的解析方法,大家都说要数LINQ to XML最简单了。不过几次想自己动手试试总是没成功,搜索到的教程都太繁杂晦涩。这次在单位实习又有解析XML的需求只有硬着头皮试试了,结果还成功了!总结下来还是需要思路清晰,XML文件就是一些节点和属性,只要掌握了对应的层次关系,代码逻辑清晰语法正确就一定能成功!

LINQ to XML确实很简单,这次主要是学习了这篇文章:

 

XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<Items>
  <Item name="接入/切换冲突引起掉话预警">
    <type name="Rx Power">
      <min value="" operator=""></min>
      <max value="" operator=""></max>
    </type>
    <type name="Tx Power">
      <min value="" operator=""></min>
      <max value="" operator=""></max>
    </type>
    <type name="Ec/Io">
      <min value="" operator=""></min>
      <max value="" operator=""></max>
    </type>
  </Item>
  <Item name="超出覆盖区引起掉话预警">
    <type name="Rx Power">
      <min value="" operator=""></min>
      <max value="-100" operator="&lt;="></max>
    </type>
    <type name="Tx Power">
      <min value="23" operator="&gt;="></min>
      <max value="" operator=""></max>
    </type>
    <type name="Ec/Io">
      <min value="" operator=""></min>
      <max value="-15" operator="&lt;"></max>
    </type>
    <type name="Tx Adj">
      <min value="10" operator="&gt;"></min>
      <max value="0" operator="&lt;"></max>
    </type>
  </Item>
</Items>

 

注:XML文件中,由于<和>符号已经被占用,因此如果需要使用该符号的地方可以使用&lt;对应<符号,&gt;对应>符号。

 

XML解析代码

	public static XML_Value_Class Read(string path)
        {
            XElement root = XElement.Load(path);//读取文件
            XML_Value_Class xmlvalue = new XML_Value_Class();//XML类
            XAttribute ItemName = null;
            XAttribute TypeValueName = null;
            XAttribute TypeValueMin = null;
            XAttribute TypeValueMax = null;
            XAttribute TypeValueMinOperator = null;
            XAttribute TypeValueMaxOperator = null;
            foreach (var item in root.Elements("Item"))//遍历节点Item
            {
                ItemName = item.Attribute("name");//这里是节点Item的name属性
                foreach (var type in item.Elements("type"))遍历节点type
                {
                    TypeValueName = type.Attribute("name");//这里是节点type的属性
                    TypeValueMin = type.Element("min").Attribute("value");//这里是节点min的属性,由于上面已经遍历到type节点,因此直接从var type读取就能找到对应的节点,然后取出属性
                    TypeValueMax = type.Element("max").Attribute("value");
                    TypeValueMinOperator = type.Element("min").Attribute("operator");
                    TypeValueMaxOperator = type.Element("max").Attribute("operator");
                    xmlvalue.value(ItemName.Value, TypeValueName.Value, TypeValueMax.Value, TypeValueMin.Value, TypeValueMaxOperator.Value, TypeValueMinOperator.Value);//这里是获取相应值赋到对应对象的函数,例如取ItemName的值语句为Itemname.Value;这里ItemName只是一个属性,在调试过程中看到的值为Item name="接入/切换冲突引起掉话预警",因此需要使用.Value操作来取出属性存储的值
                }
            }
            return xmlvalue;
        }

 

相应的还有写文件的操作,既然已经读取出来了,可以直接用=为属性赋值,也可以用ItemName.SetValue(value);来修改属性值。最后root.Save(path);

 

这次还学到一些关于数据的操作:

string.Empty; //表示空字符串,即""

Convert.ToDouble("12"); //将string类型的字符强制转换成double类型,要求string内容必须为数字字符。

double = double.NaN; //表示不是数字的值,次字段为常量。本次用于当max和min属性为string.Empty的时候赋值给double类型使用

double.IsNaN(double) //返回bool值,判断double类型数据是否为数字