Извлечение узлов из строки, содержащей xml - PullRequest
0 голосов
/ 26 января 2011

Я использую веб-сервис и получаю обратно конверт SOAP и пытаюсь извлечь некоторые данные, но постоянно сталкиваюсь с ошибками. Я пытался с LINQ, используя преобразование xsl и т. Д.

Ответ:

<?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>
- <ABRSearchByABNResponse xmlns="some service /">
- <ABRPayloadSearchResults>
- <request>
- <identifierSearchRequest>
  <authenticationGUID>some guid</authenticationGUID> 
  <identifierType>ABN</identifierType> 
  <identifierValue>54 108 408 566</identifierValue> 
  <history>N</history> 
  </identifierSearchRequest>
  </request>
- <response>
  <usageStatement>some statementusageStatement> 
  <dateRegisterLastUpdated>2011-01-26</dateRegisterLastUpdated> 
  <dateTimeRetrieved>2011-01-26T15:14:45.9776800+11:00</dateTimeRetrieved> 
- <businessEntity>
  <recordLastUpdatedDate>2000-08-26</recordLastUpdatedDate> 
- <ABN>
  <identifierValue>11111111111</identifierValue> 
  <isCurrentIndicator>Y</isCurrentIndicator> 
  <replacedIdentifierValue xsi:nil="true" /> 
  <replacedFrom>0001-01-01</replacedFrom> 
  </ABN>
- <entityStatus>
  <entityStatusCode>Active</entityStatusCode> 
  <effectiveFrom>2000-06-05</effectiveFrom> 
  <effectiveTo>0001-01-01</effectiveTo> 
  </entityStatus>
  <ASICNumber /> 
- <entityType>
  <entityTypeCode>IND</entityTypeCode> 
  <entityDescription>Individual/Sole Trader</entityDescription> 
  </entityType>
- <goodsAndServicesTax>
  <effectiveFrom>2000-07-01</effectiveFrom> 
  <effectiveTo>0001-01-01</effectiveTo> 
  </goodsAndServicesTax>
- <legalName>
  <givenName>some name</givenName> 
  <otherGivenName /> 
  <familyName>some name</familyName> 
  <effectiveFrom>2000-08-26</effectiveFrom> 
  <effectiveTo>0001-01-01</effectiveTo> 
  </legalName>
- <mainBusinessPhysicalAddress>
  <stateCode>QLD</stateCode> 
  <postcode>4350</postcode> 
  <effectiveFrom>2000-08-26</effectiveFrom> 
  <effectiveTo>0001-01-01</effectiveTo> 
  </mainBusinessPhysicalAddress>
  </businessEntity>
  </response>
  </ABRPayloadSearchResults>
  </ABRSearchByABNResponse>
  </soap:Body>
  </soap:Envelope>

Мой xslt-файл:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:soap="http://soap/Envelope/Body/">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
      <table>
        <tr>
          <th>Name</th>
        </tr>
        <xsl:for-each select="soap/ABRSearchByABNResponse/ABRPayloadSearchResults/response/businessEntity/legalName">
          <tr>
            <td>
              <xsl:value-of select="givenName"/>
            </td>      
          </tr>   
      </xsl:for-each>

      </table>
    </xsl:template>
</xsl:stylesheet>

В своем коде я попытался:

XmlTextReader reader = new XmlTextReader(new StringReader(searchPayload));
string XslPath = @"http://localhost:5434/SearchResult.xslt";
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(XslPath);
transform.Transform(reader, null, Response.Output);

но имя пустое, я также пытался с

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(new StringReader(searchPayload));

XmlNodeList xnList = xmlDoc.SelectNodes("/soap:Envelope/soap:Body/ABRSearchByABNResponse/ABRPayloadSearchResults/request/response/businessEntity/ABN");
foreach(XmlNode xn in xnList)
{
    string abn = xn["identifierValue"].InnerText;
    label1.Text = abn;
}

но затем я получаю «Необходим диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию». и т. д.

редактирование: Поэтому теперь я использую (searchPayload - строка, содержащая ответ xml)

XDocument doc = XDocument.Load(new StringReader(searchPayload));
XNamespace ns = @"http://abr.business.gov.au/ABRXMLSearch/";

var ABN = doc.Descendants(ns + "businessEntity")
             .Elements(ns + "ABN")
             .Select(node => new
             {
                 identifierValue = node.Element(ns + "identifierValue").Value,
                 isCurrentIndicator = node.Element(ns + "isCurrentIndicator").Value,
                 replacedIdentifierValue = node.Element(ns + "replacedIdentifierValue").Value,
                 replacedFrom = node.Element(ns + "replacedFrom").Value
             }).ToList();

Как мне получить отсюда ABN, например, в текстовом поле?

`label1.Text = ABN.ToString();` gives me
Results:System.Collections.Generic.List`1[<>f__AnonymousType0`4[System.String,System.String,System.String,System.String]]

Edit2: Теперь я понял, что могу сделать:

foreach(var item in ABN)
{
    label1.Text += item.identifierValue.ToString();
}

Ответы [ 2 ]

2 голосов
/ 26 января 2011

@ Джон Сондерс прав: вы должны указать пространство имен при получении данных из XML. В настоящее время пространство имен установлено в XML:

 <ABRSearchByABNResponse xmlns="some service /">

Быстрая проверка с использованием LINQ to XML позволяет успешно получить результаты.

XDocument doc = XDocument.Load(@"test.xml");
XNamespace ns = "some service /";

var ABN = doc.Descendants(ns + "businessEntity")
             .Elements(ns + "ABN")
             .Select(node => new
             {
                identifierValue = node.Element(ns + "identifierValue").Value,
                isCurrentIndicator = node.Element(ns + "isCurrentIndicator").Value,
                replacedIdentifierValue = node.Element(ns + "replacedIdentifierValue").Value,
                replacedFrom = node.Element(ns + "replacedFrom").Value
             }).ToList(); 
1 голос
/ 26 января 2011

Элемент ABRSearchByABNResponse и его потомки находятся в пространстве имен "some service".

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