今天在调试对XML进行查询数据时,发现查找到的数据总是为零。
后来通过在网上查找资料,发现了一个不错的学习LinqtoXml的网站:https://msdn.microsoft.com/zh-cn/library/mt693116.aspx,也正是通过对该例子的分析查找到了问题所在。
举个例子:
XML文件:
<?xml version="1.0"?> <Tests> <Test TestId="0001" TestType="CMD"> <Name>Convert number to string</Name> <CommandLine>Examp1.EXE</CommandLine> <Input>1</Input> <Output>One</Output> </Test> <Test TestId="0002" TestType="CMD"> <Name>Find succeeding characters</Name> <CommandLine>Examp2.EXE</CommandLine> <Input>abc</Input> <Output>def</Output> </Test> <Test TestId="0003" TestType="GUI"> <Name>Convert multiple numbers to strings</Name> <CommandLine>Examp2.EXE /Verbose</CommandLine> <Input>123</Input> <Output>One Two Three</Output> </Test> <Test TestId="0004" TestType="GUI"> <Name>Find correlated key</Name> <CommandLine>Examp3.EXE</CommandLine> <Input>a1</Input> <Output>b1</Output> </Test> <Test TestId="0005" TestType="GUI"> <Name>Count characters</Name> <CommandLine>FinalExamp.EXE</CommandLine> <Input>This is a test</Input> <Output>14</Output> </Test> <Test TestId="0006" TestType="GUI"> <Name>Another Test</Name> <CommandLine>Examp2.EXE</CommandLine> <Input>Test Input</Input> <Output>10</Output> </Test> </Tests>在对该XML文件进行查询时,若语句为:
XElement root = XElement.Load("TestConfig.xml");
IEnumerable<XElement> tests =
from el in root.Elements("Tests").Elements("Test")
where (string)el.Element("CommandLine") == "Examp2.EXE"
select el;
是无法查找到数据的。
正确的写法是:
XElement root = XElement.Load("TestConfig.xml"); IEnumerable<XElement> tests = from el in root.Elements("Test") where (string)el.Element("CommandLine") == "Examp2.EXE" select el;
大家有没有找到这两者写法上的区别,唯一的区别就在于错误的写法多了一个
.Elements("Tests")。
这个是我们很容易犯的错误,按照节点上来说,第一个节点应该是【Tests】,个人理解是在使用 load方法时就已经是第一层级的根节点了。总之第一层级的节点不需要写,这样查询的结果才不会有问题。