为何IXmlNode的ChildNodes返回含空白值的XmlNodeList?
为什么ChildNodes会返回包含空白节点的NodeList?
这是个XML解析里超常见的小坑!原因其实很直白:你所用的XML解析器默认会把XML元素之间的空白文本节点也纳入ChildNodes的返回结果里。
先看你给出的XML内容:
<?xml version="1.0" encoding="UTF-8"?> <Service> <Name Value="122" ValueType="string"/> <Number Value="1222" ValueType="long"/> <ApplicationName Value="Service" ValueType="string"/> <Count Value="10" ValueType="long"/> </Service>
里面<Service>和第一个<Name>之间的换行、空格,<Name>与<Number>之间的换行空格……这些在XML规范里都属于文本节点(只是内容全是空白字符),解析器会把它们当作合法的子节点保留下来。
你可以数一下:
<Service>后的空白节点(1)<Name>元素节点(2)<Name>后的空白节点(3)<Number>元素节点(4)<Number>后的空白节点(5)<ApplicationName>元素节点(6)<ApplicationName>后的空白节点(7)<Count>元素节点(8)<Count>后的空白节点(9)
刚好是9个节点,和你看到的结果完全对应。
解决办法
这里给你几个实用的处理方案:
- 用XPath筛选元素节点:直接调用
SelectNodes方法配合XPath表达式"*",比如Node.SelectNodes("*"),这样只会返回<Name>、<Number>这类元素节点,自动忽略空白文本节点。 - 修改解析器的空白保留设置:如果用的是
XmlDocument,可以把PreserveWhitespace设为false,解析时就会自动跳过元素间的空白节点。代码示例:XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = false; doc.Load("你的XML文件路径"); - 手动过滤节点:遍历
ChildNodes时,只保留节点类型为XmlNodeType.Element的项。示例代码:var targetNodes = Node.ChildNodes.Cast<XmlNode>() .Where(node => node.NodeType == XmlNodeType.Element) .ToList();
这样就能精准得到你需要的4个实际元素节点了!
内容的提问来源于stack exchange,提问作者Roshmi Benny
相关产品推荐
相关产品推荐

