用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");//失败

 

posted @ 2022-07-24 15:22  CCJungle  阅读(192)  评论(0编辑  收藏  举报