使用xpath获取xml中节点

        获取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;
        }

重点:目标节点有n个命名空间

        对于有命名空间的xml,要根据自己编写的xpath路径判断判断有效命名空间,将有效命名空间添加到XmlNamespaceManager中,xpath路径要声明命名空间



	
		
			
				xml数据
			
		
	

        说明:xml文件中有多个命名空间,且在根节点外的节点,也含有命名空间

        需求:查找里的数据

        分析:根据目标节点的xpath添加命名空间

                标签上声明了命名空间是soap,即​​​​​​​xmlns:soap="http://www.w3.org/2003/05/hahha" 

                标签没有声明命名空间,故为默认命名空间xmlns="http://www.baidu.com/"

        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);
        }

        xpath半路径:   ----难点             

       直接搜索目标节点: "//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);
        }

 tips

        xmlns:xmlNamespace的缩写

        xmlns="http://www.baidu.com/"

                没有声明前缀,为默认命名空间

                其标签可以简写,写为

                故没有声明所属命名空间的标签,都属于默认命名空间

        xmlns:soap="http://www.w3.org/2003/05/hahha" 

                为命名空间声明前缀

                其标签写为,不可以简写,soap不能省略

        XML命名空间是为了防止标签名称相同冲突,URI内容随意,只是为了让命名空间唯一

                参考连接:XML 命名空间(XML Namespaces)  下的XML Namespace (xmlns) 属性

               

你可能感兴趣的:(xml,xml)