获取xml中的节点,可以使用XmlNode.SelectSingleNode()方法,不过针对xml是否存在命名空间,XmlNode提供了2种方法来获取
目录
基本情况:没有命名空间
重点:目标节点有n个命名空间
xpath全路径:
xpath半路径: ----难点
tips
xml文件
zhangsan>
11
lisi>
22
获取节点的代码:
public void getXmlNode(string xmlStr,string xpath)
{
XmlDocument xmlD = new XmlDocument();
xmlD.LoadXml(xmlStr);
//测试用,获取xmlD下第一个name节点
xpath = "//name";
XmlNode xn = xmlD.SelectSingleNode(xpath);
string nodeXml = xn.InnerXml;
}
对于有命名空间的xml,要根据自己编写的xpath路径判断判断有效命名空间,将有效命名空间添加到XmlNamespaceManager中,xpath路径要声明命名空间
xml数据
说明:xml文件中有多个命名空间,且在根节点外的节点,也含有命名空间
需求:查找
分析:根据目标节点的xpath添加命名空间
xpath路径从根节点开始:"/a:Envelope/a:Body/b:DoXmlResponse/b:DoXmlResult"
public void getXmlNode(string xmlStr,string xpath)
{
XmlDocument xmlD = new XmlDocument();
xmlD.LoadXml(xmlStr);
XmlNamespaceManager nsmanager = new XmlNamespaceManager(xmlD.NameTable);
//SelectSingleNode()的xpath路径中包含 a,b 两个命名空间
//命名空间的前缀可以随便命名,不需要跟xml文件中的前缀一样
nsmanager.AddNamespace("a", "http://www.w3.org/2003/05/hahha");
nsmanager.AddNamespace("b", "http://www.baidu.com/");
XmlNode xn1 = xmlD.SelectSingleNode("/a:Envelope/a:Body/b:DoXmlResponse/b:DoXmlResult", nsmanager);
XmlNode xn2 = xmlD.SelectSingleNode("//a:Body/b:DoXmlResponse/b:DoXmlResult", nsmanager);
XmlNode xn3 = xmlD.SelectSingleNode("//a:Body//b:DoXmlResult", nsmanager);
}
直接搜索目标节点: "//b:DoXmlResult"
只需要添加目标节点的命名空间即可
public void getXmlNode(string xmlStr,string xpath)
{
XmlDocument xmlD = new XmlDocument();
xmlD.LoadXml(xmlStr);
XmlNamespaceManager nsmanager = new XmlNamespaceManager(xmlD.NameTable);
//SelectSingleNode()的xpath路径中包含 b 一个命名空间
//命名空间的前缀可以随便命名,不需要跟xml文件中的前缀一样
nsmanager.AddNamespace("b", "http://www.baidu.com/");
XmlNode xn4 = xmlD.SelectSingleNode("//b:DoXmlResult", nsmanager);
}
xmlns:xmlNamespace的缩写
xmlns="http://www.baidu.com/"
没有声明前缀,为默认命名空间
其标签可以简写,
故没有声明所属命名空间的标签,都属于默认命名空间
xmlns:soap="http://www.w3.org/2003/05/hahha"
为命名空间声明前缀
其标签写为
XML命名空间是为了防止标签名称相同冲突,URI内容随意,只是为了让命名空间唯一
参考连接:XML 命名空间(XML Namespaces) 下的XML Namespace (xmlns) 属性