zoukankan      html  css  js  c++  java
  • 使用XmlDocument.SelectNodes遍历xml元素遇到的一个XPathException

    使用XmlDocument类时候报错:

    未处理的XPathException:
    需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。

    需要使用XmlNamespaceManager类:Resolves, adds, and removes namespaces to a collection and provides scope management for these namespaces.

    这是因为使用的soap文档含有自己的命名空间。相同问题:http://bbs.csdn.net/topics/350101606

    最终修改后的代码:

     string soap = "";
                        soap += "<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">";
                        soap += "<SOAP-ENV:Body>";
                        soap += "<AP-MSG:SubscriptionRequest xmlns:AP-MSG="http://www.vestas.dk/2001/04/ap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">";
                        soap += "<RequestBase ClientRequestHandle="41" ReturnItemTime="false" ReturnItemName="true" CallbackURL="10.116.21.222:1055" CallbackRate="PT10S"/>";
                        soap += "<ItemRequestSpec MaxAge="PT0.1S"/>";
                        soap += "<ItemList>";
                        foreach (IoTag tag in Tags)
                        {
                            soap += string.Format("<Item ItemName="{0}"/>", tag.Name);
                        }
                        soap += "</ItemList>";
                        soap += "</AP-MSG:SubscriptionRequest>";
                        soap += "</SOAP-ENV:Body>";
                        soap += "</SOAP-ENV:Envelope>";
                        string subscriptionRequest = "";
                        subscriptionRequest += "POST * HTTP/1.1
    ";
                        subscriptionRequest += "Content-Type:text/xml;charset=ISO-8859-1
    ";
                        subscriptionRequest += "Connection:Keep-Alive
    ";
                        subscriptionRequest += "SOAPAction:http://www.vestas.dk/2001/04/ap#SubscriptionRequest
    ";
                        subscriptionRequest += string.Format("Content-Length:{0}
    ", soap.Length);
                        subscriptionRequest += "
    ";
                        subscriptionRequest += soap;
    
                        XmlDocument xDoc = new XmlDocument();
                        xDoc.LoadXml(soap);
                        XmlNamespaceManager nsMgr = new XmlNamespaceManager(xDoc.NameTable);
                        nsMgr.AddNamespace("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
                        nsMgr.AddNamespace("AP-MSG", "http://www.vestas.dk/2001/04/ap");
                        nsMgr.AddNamespace("SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
                        XmlElement xe = xDoc.DocumentElement;
                        XmlNodeList xnl = xDoc.SelectNodes("/SOAP-ENV:Envelope/SOAP-ENV:Body/AP-MSG:SubscriptionRequest/ItemList/Item", nsMgr);

                foreach (XmlNode item in xnl) { string s = item.Attributes["ItemName"].Value; }
  • 相关阅读:
    tar打包如何不打包某一个文件夹(排除某些文件夹)
    第一个SpringBoot应用
    Linux(以RHEL7为例)下添加工作区的方法|| The Way To Add Workspace On Linux
    Linux(以centos7为例)下自动挂载NTFS硬盘
    基于Moodle的IT课程辅助教育平台搭建
    搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
    如何利用word2013写图文并茂的博客
    如何安装win10+Red Hat Enterprise Linux双系统?
    课堂练习:ex 4-20
    实验二 函数重载、函数模板、简单类的定义和实现
  • 原文地址:https://www.cnblogs.com/jumahe/p/4540733.html
Copyright © 2011-2022 走看看