C#XPath Soap,如何导航到嵌入式节点

时间:2011-07-01 18:55:34

标签: c# .net xml soap xpath

在C#,Asp.Net中,我试图在BISearchResponse中返回Error节点: 我能够在XMLNode中返回GetWireResult节点。 如何进入错误节点?

<?xml version="1.0" encoding="utf-8" ?> 
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-     <soap:Body>
-          <GetWireResponse xmlns="http://OpenSolutions.com/">
                <GetWireResult><?xml version="1.0"?> 
                      <BISearchResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
                            <Error xmlns="https://bixg.choicepoint.com/webservices/3.0"> 
                                   <Message>BI System: Failed to Login</Message> 
                                   <Code>536870917</Code>
                             </Error>
                      </BISearchResponse>  
                </GetWireResult> 
            </GetWireResponse>
       </soap:Body>
  </soap:Envelope>

我的代码: XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(result);

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
            nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
            nsmgr.AddNamespace("ab", "http://OpenSolutions.com/");
            nsmgr.AddNamespace("bg", " https://bixg.choicepoint.com/webservices/3.0");
            nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
            nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");

            XmlNode xmlnode = xmlDoc.DocumentElement.SelectSingleNode("/soap:Envelope/soap:Body/ab:GetWireResponse", nsmgr);

这适用于此处。 。 我在这里添加了xml,但它只在编辑模式下可见。

<?xml version="1.0" encoding="utf-8" ?> 
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body>
- <GetWireResponse xmlns="http://OpenSolutions.com/">
  <GetWireResult><?xml version="1.0"?> <BISearchResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Error xmlns="https://bixg.choicepoint.com/webservices/3.0"> <Message>BI System: Failed to Login</Message> <Code>536870917</Code> </Error> </BISearchResponse></GetWireResult> 
  </GetWireResponse>
  </soap:Body>
  </soap:Envelope>

2 个答案:

答案 0 :(得分:1)

在调试模式下,复制此XML时,请尝试选择其他调试可视化工具,例如“文本可视化器”。您可以单击数据提示中的放大镜图标选择它。

我认为您的XML看起来像:

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetWireResponse xmlns="http://OpenSolutions.com/">
      <GetWireResult>
        &lt;?xml version="1.0"?&gt;
        &lt;BISearchResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;Error xmlns="https://bixg.choicepoint.com/webservices/3.0">
        &lt;Message>BI System: Failed to Login&lt;/Message&gt;
        &lt;Code>536870917&lt;/Code&gt;
        &lt;/Error&gt;
        &lt;/BISearchResponse&gt;
      </GetWireResult>
    </GetWireResponse>
  </soap:Body>
</soap:Envelope>

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetWireResponse xmlns="http://OpenSolutions.com/">
      <GetWireResult>
        <![CDATA[
        <?xml version="1.0"?>
        <BISearchResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <Error xmlns="https://bixg.choicepoint.com/webservices/3.0">
            <Message>BI System: Failed to Login</Message>
            <Code>536870917</Code>
          </Error>
        </BISearchResponse>
        ]]>
      </GetWireResult>
    </GetWireResponse>
  </soap:Body>
</soap:Envelope>

不管。因此,您可以使用以下XPath选择GetWireResult

/soap:Envelope/soap:Body/ab:GetWireResponse/ab:GetWireResult

然后将其加载到新的XML文档中并获得所需的响应。

答案 1 :(得分:0)

你快到了。扩展你的XPath

"/soap:Envelope/soap:Body/ab:GetWireResponse"

"/soap:Envelope/soap:Body/ab:GetWireResponse/ab:GetWireResult/ab:BISearchResponse/bg:Error"

然而,在<?xml version="1.0"?>中间插入额外的XML序言会使XML格式不正确。我很惊讶它可以被处理。我认为C#API应该在xmlDoc.LoadXml(result)上抛出异常。

另一种方法,看上面没有为您返回任何内容,将使用您的C#代码来探索XML文档的结构并打印出每个节点的子节点。例如。如果您为"/soap:Envelope/soap:Body/ab:GetWireResponse"而不是"/soap:Envelope/soap:Body/ab:GetWireResponse/ab:GetWireResult"获取节点,ab:GetWireResponse是否具有哪些文本节点子节点,如果是,那么它们的值(内容)是多少?这应该可以深入了解XPath无法正常工作的原因。

如果那里有一块未解析(即转义)的XML,您可以将其复制出来并像您所说的那样将其解析为XML,或者只是使用正则表达式搜索所需的模式...具体取决于复杂性