之前了解过一点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="<="></max> </type> <type name="Tx Power"> <min value="23" operator=">="></min> <max value="" operator=""></max> </type> <type name="Ec/Io"> <min value="" operator=""></min> <max value="-15" operator="<"></max> </type> <type name="Tx Adj"> <min value="10" operator=">"></min> <max value="0" operator="<"></max> </type> </Item> </Items>
注:XML文件中,由于<和>符号已经被占用,因此如果需要使用该符号的地方可以使用<对应<符号,>对应>符号。
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类型数据是否为数字