2016-02-02 3 views
0

У меня есть xml-файл, и я хочу извлечь из него некоторые данные.Условное значение с linq

У меня есть этот запрос linq, и я получаю детали в var, но я не могу достичь значений.

XNamespace aw1 = "http://www.stackoverflow.com/FAQ/"; 
var r03 = from el in obj.Descendants().Elements(aw1 + "co") 
           select el.Elements(aw1 + "doc"); 

Я попытался с помощью цикла, но я получаю ошибку произнесения, и я думаю, что есть прямой путь, чтобы получить значение, я пытаюсь избежать петли, потому что мы, я всегда знаю структуру, и это не нужно разбирать весь файл и просто получить то, что я ищу.

<?xml version="1.0" encoding="UTF-8"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Header> 
    <wsse:Security S:mustUnderstand="1" xmlns:wsse="http://docs.org/wss/2004/secext-1.0.xsd"> 
     <wsu:Timestamp xmlns:wsu="http://docs.org/utility-1.0.xsd"> 
     <wsu:Created>2016-01-28T21:54:57Z</wsu:Created> 
     </wsu:Timestamp> 
    </wsse:Security> 
    </S:Header> 
    <S:Body> 
    <ConsultarEdocumentResponse xmlns:ns2="http://www.stackoverflow.com/" xmlns="http://www.stackoverflow.com/FAQ/"> 
     <response> 
     <mensaje>No Message</mensaje> 
     <resultadoBusqueda> 
      <co> 
      <doc>151AQP</doc> 
      <patentes> 
       <patente>1111</patente> 
      </patentes> 
      <facturas> 
       <factura> 
       <subdivision>0</subdivision> 
       <mercancias> 
       <mercancia> 
        <desc>ACCESORIO</desc> 
        <cantidad>189000</cantidad> 
       </mercancia> 
       <mercancia> 
        <desc>ACCESORIO A</desc> 
        <cantidad>9000</cantidad> 
       </mercancia> 
       </mercancias> 
       </factura> 
      </facturas> 
      <emisor> 
       <tipoIdentificador>0</tipoIdentificador> 
       <domicilio> 
       <calle>STREET</calle> 
       <codigoPostal>55555</codigoPostal> 
       </domicilio> 
      </emisor> 
      <destinatario> 
       <tipoIdentificador>1</tipoIdentificador> 
       <domicilio> 
       <calle>Street</calle> 
       <codigoPostal>65555</codigoPostal> 
       </domicilio> 
      </destinatario> 
      </co> 
     </resultadoBusqueda> 
     </response> 
    </ConsultarEdocumentResponse> 
    </S:Body> 
</S:Envelope> 

Пожалуйста, помогите мне с этим, я пытался несколько вещей, но я чувствую, что я не получаю ничего ПОЛЕЗНЫЕ. Заранее спасибо.

+2

Добро пожаловать на переполнение стека. Пожалуйста, предоставьте [mcve] - в идеале, более короткий XML-файл. –

+0

Вы хотите сказать, что вы хотите получить список значений в элементах doc? Итак, для примера xml вам нужно одно значение 151AQP? – juharr

+0

Я дал это, и не могу вспомнить запрос с XDocument, так трудно. Действительно плохой API, на мой взгляд. –

ответ

1

LinqToXML - это действительно отличная библиотека, но SOAP настолько плоха, что ее плохость также идет в LinqToXML. Похоже, вы смешано несколько пространств имен XML:

 XDocument xdoc = XDocument.Parse(xml); 

     XNamespace soapNs = "http://schemas.xmlsoap.org/soap/envelope/"; 
     XNamespace soNs = "http://www.stackoverflow.com/FAQ/"; 

     var docList = xdoc.Root.Descendants(soapNs + "Body") 
      .Descendants(soNs + "co") 
      .Descendants(soNs + "doc") 
      .ToList(); 

     docList.ForEach(x => Console.WriteLine(x.Value)); 

Для получения дополнительной информации проверить это так вопрос: Using LINQ to XML to Parse a SOAP message

+0

Корректный подход к внедрению –

+0

Благодарим вас за помощь @csharpfolk, только что появившиеся пространства имен, я изменил вторую для конфиденциальности, я могу получить желаемое значение с помощью запроса (tag doc), я понимаю, что я могу сделать то же самое в других запросах получить другие значения, но их можно получить в одном запросе? – JCM

+0

Я общаюсь с вашим запросом, и я могу получить больше значений в одном запросе, но мне не удалось получить значения с других уровней, это то, что у меня есть до сих пор. – JCM

Смежные вопросы