【问题标题】:Query in document with inline default namespace使用内联默认命名空间在文档中查询
【发布时间】:2014-03-14 17:03:27
【问题描述】:

我正在尝试/努力在以下 XML 结构中查询 getCompanyListResponse-Tag(上面的每个标签都可以与 namespacemanager 和“soap”前缀一起正常工作):

<?xml version=”1.0” encoding=”UTF-8”?> 
<soap:Envelope xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”> 
  <soap:Header /> 
  <soap:Body> 
    <getCompanyListResponse xmlns=”http://test.org/schema”>
      <company> 
        <id>12345</id> 
        <address> 
          <role>LOCATION</role>
        </adress>
      </company>
    </getCompanyListResponse>
  </soap:Body>
</soap:Envelope>

不幸的是,我无法更改任何 XML,因为 XML 是 Web 服务的响应,我无法影响。 遗憾的是,将默认命名空间添加到 XMLNamespacemanager 并不起作用。 我没有找到任何关于如何使用 local-name 函数的足够答案。

Stream responseStream = response.GetResponseStream();
XPathDocument compDoc = new XPathDocument(responseStream);
XPathNavigator root =  compDoc.CreateNavigator();

XmlNamespaceManager resolver = new XmlNamespaceManager(root.NameTable);
resolver.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
resolver.AddNamespace(String.Empty, "http://test.org/schema");
resolver.AddNamespace("null", "http://test.org/schema");
root.MoveToFirstChild();
XPathNavigator body = root.SelectSingleNode("[/local-name()='soap:Envelope/soap:Body/getCompanyListResponse']", resolver);

在上面代码的最后一行,我得到了异常:“表达式必须产生一个节点集”(或接近那个,因为我用德语使用 Visual Studio,这是我的翻译尝试)

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    您需要在路径中使用前缀来寻址默认命名空间中的元素:

    XPathDocument compDoc = new XPathDocument(responseStream);
    XPathNavigator root =  compDoc.CreateNavigator();
    
    XmlNamespaceManager resolver = new XmlNamespaceManager(root.NameTable);
    resolver.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
    resolver.AddNamespace("ts", "http://test.org/schema");
    
    XPathNavigator comp = root.SelectSingleNode("/soap:Envelope/soap:Body//ts:company", resolver);
    
    string id = comp.SelectSingleNode("ts:id").Value;
    

    您在没有步骤的谓词中使用 local-name() 的尝试也不会起作用,但无论如何都没有必要。

    【讨论】:

      【解决方案2】:

      在我看来,您正在尝试读取 XML 流,但如果我不理解您,我深表歉意。 XmlReader 在我看来它是完成这项工作的正确工具。

      XmlReader http://msdn.microsoft.com/en-us/library/system.xml.xmlreader(v=vs.110).aspx

      var reader = XmlReader.Create(responseStream);
      var xmlnsString = string.Empty;
      string id;
      while(reader.Read()){
      if(reader.IsStartElement()){
          switch(reader.Name){
              case("getCompanyListResponse") : xmlnsString = reader.GetAttribute("xmlns"); 
              //list any name of a node you want to work on here
              case("id") : id = reader.ReadString();
              default: break;
      
      
          }
      
      }    
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 2015-12-14
        相关资源
        最近更新 更多