C # XPath Soap, как перейти на встроенный узел - PullRequest
2 голосов
/ 01 июля 2011

В C #, Asp.Net, я пытаюсь вернуть узел Error внутри BISearchResponse: Я могу получить узел GetWireResult, возвращенный в XMLNode. Как добраться до узла Error?

<?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 ]

1 голос
/ 02 июля 2011

В режиме отладки, когда вы копируете этот 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>

Неважно.Таким образом, вы можете выбрать GetWireResult, используя следующий XPath:

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

, а затем загрузить его содержимое в новый XML-документ и получить желаемый ответ.

0 голосов
/ 01 июля 2011

Ты почти у цели. Продли свой XPath

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

до

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

Однако этот дополнительный пролог XML, застрявший там посередине, <?xml version="1.0"?>, делает 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, как вы сказали, или просто найти нужный вам шаблон с помощью регулярного выражения ... в зависимости от сложности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...