用XmlDocument查找含有域名空间的节点
在Xml中SelectSingleNode方法,xpath查找某节点用法 - bxzjzg - 博客园 (cnblogs.com)帖子钟,给出了多种查找节点的方法。
这些方法,部分方法是不成功的,但仅限于读取没有域名空间的XML文件。如果XML文件中带有域名空间,则没有办法读出来。
读取带有域名空间的XML文件,需要在SelectNodes或者SelectSingleNode携带域名空间管理器对象XmlNamespaceManager查找,官方定义为:
public XmlNodeList SelectNodes(string xpath, XmlNamespaceManager nsmgr);
下面给出使用案例。
1. 假设要访问的数据如下:
1 <?xml version="1.0"?> 2 <PIM> 3 <Responses Legacy="FALSE"> 4 <Response Action="SetTxFreqs" Units="" /> 5 <Response Action="GetImFreqs" Units="MHz"> 6 <Double>1870.00</Double> 7 <Double>1810.00</Double> 8 <Double>1750.00</Double> 9 <Double>1690.00</Double> 10 </Response> 11 <Response Action="GetImPower" Units="dBm"> 12 <Double>-115.85</Double> 13 <Double>-200.00</Double> 14 <Double>-200.00</Double> 15 <Double>-200.00</Double> 16 </Response> 17 </Responses> 18 </PIM>
2.以下为测试代码:
XmlDocument doc = new XmlDocument(); doc.Load("PimResponseDemo1.xml"); XmlNode root = doc.DocumentElement; //定义域名空间 XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("aa", "http://www.kaelus.com"); var list1 = doc.SelectNodes("aa:PIM/aa:Responses/aa:Response", nsmgr);//完整路径查找,成功 var list2 = doc.SelectNodes("//aa:Response", nsmgr); //跨过所有父级节点查找,成功 var list3 = doc.SelectNodes("aa:PIM//aa:Response", nsmgr); //跨过中间节点,成功 var node1 = doc.SelectSingleNode("aa:PIM/aa:Responses/aa:Response[@Action='GetImFreqs']", nsmgr);//带属性查找,成功 var list5 = doc.SelectNodes("PIM/Responses/Response"); //没有带上域名,失败 var list6 = doc.SelectNodes("Responses/Response");//无域名,失败 var list7 = doc.SelectNodes("aa:Responses/aa:Response", nsmgr);//相对路径查找,失败 var list8 = doc.SelectNodes("../Response");//失败 var list9 = doc.SelectNodes("../aa:Response", nsmgr);//失败 var list10 = doc.SelectNodes("PIM//Response"); //无域名,失败 var node2 = doc.SelectSingleNode("PIM/Responses/Response[@Action='GetImFreqs']");//无域名,失败 var node3 = doc.SelectSingleNode("aa:PIM/Responses/Response", nsmgr);//失败 var node4 = doc.SelectSingleNode("aa:PIM/aa:Responses/aa:Response[@aa:Action='GetImFreqs']", nsmgr);//标志位置错误,失败 var node5 = doc.SelectSingleNode("PIM/Responses/Response");//失败