Получение данных из XDocument с помощью Linq

#c# #xml

#c# #xml

Вопрос:

Я пытаюсь получить URL-адрес из XML-ответа, который я получаю от API. Я пытался использовать этот код до сих пор, но я застрял:

  using (StringReader s = new StringReader(result)) //result is the xml returned by the api
                        {
                            XDocument xDoc;
                            xDoc = XDocument.Load(s);
                            var filterXml = xDoc.Descendants("content");
                            Console.WriteLine(filterXml);
                        }
 

И это пример XML, который я пытаюсь прочитать:

 <feed xml:base="http://someurl/Seg/_vti_bin/Listdata.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Documents00</title>
  <id>http://someurl.com.do/Seg/_vti_bin/Listdata.svc/Documents00</id>
  <updated>2020-11-22T06:09:33Z</updated>
  <link rel="self" title="Documentos008046" href="Documentos008046" />
  <entry m:etag="W/amp;quot;3amp;quot;">
    <id>http://someurl/Seg/_vti_bin/Listdata.svc/Documents00(805)</id>
    <title type="text"></title>
    <updated>2020-11-19T15:02:20-04:00</updated>
    <author>
      <name />
    </author>
    <link m:etag="amp;quot;{3149A72A-9FBA-40B0-A8EA-B0FB7E46C549},4amp;quot;" rel="edit-media" title="Documents00Item" href="Documents00(805)/$value" />
    <link rel="edit" title="Documentos008046Item" href="Documentos008046(805)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CreadoPor" type="application/atom xml;type=entry" title="CreadoPor" href="Documentos008046(805)/CreadoPor" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ModificadoPor" type="application/atom xml;type=entry" title="ModificadoPor" href="Documents00(805)/ModificadoPor" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/DesprotegidoPara" type="application/atom xml;type=entry" title="DesprotegidoPara" href="Documents00(805)/DesprotegidoPara" />
    <category term="Microsoft.SharePoint.DataService.Documentos008046Item" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/octetstream" src="http://someurl/Seg/Documents00/somefiletodownload.xlsx" />
    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
      <d:IdDeTiposDeContenido>0x01010042419E2F2397694F91DDB2DF1A437E9A</d:IdDeTiposDeContenido>
      <d:Nombre>somefiletodownload.xlsx</d:Nombre>
      <d:Título m:null="true"></d:Título>
      <d:Cliente>Some Costumer</d:Cliente>
      <d:TipoCliente>I</d:TipoCliente>
      <d:TipoArchivo>N</d:TipoArchivo>
      <d:Producto>SEGURO DE VIDA COLECTIVO</d:Producto>
      <d:Anio>2020</d:Anio>
      <d:Mes>09</d:Mes>
      <d:Dia>16</d:Dia>
      <d:Enlace>VuPnHC81l6n4GE4xXndbFg00</d:Enlace>
      <d:Oficina>OFICINA PRINCIPAL</d:Oficina>
      <d:Ramo>AUTO</d:Ramo>
      <d:Poliza>SVC-2481</d:Poliza>
      <d:IndicadorEmail>Si</d:IndicadorEmail>
      <d:TipoDocumento>POLIZA</d:TipoDocumento>
      <d:Documento>somefiletodownload.xlsx</d:Documento>
      <d:Identificador m:type="Edm.Int32">805</d:Identificador>
      <d:TipoDeContenido>Documento</d:TipoDeContenido>
      <d:Creado m:type="Edm.DateTime">2020-11-19T14:58:55</d:Creado>
      <d:CreadoPorId m:type="Edm.Int32">30084</d:CreadoPorId>
      <d:Modificado m:type="Edm.DateTime">2020-11-19T15:02:20</d:Modificado>
      <d:ModificadoPorId m:type="Edm.Int32">30084</d:ModificadoPorId>
      <d:CopiarOrigen m:null="true"></d:CopiarOrigen>
      <d:EstadoDeAprobación>0</d:EstadoDeAprobación>
      <d:RutaDeAcceso>/seg/Documents00</d:RutaDeAcceso>
      <d:DesprotegidoParaId m:type="Edm.Int32" m:null="true"></d:DesprotegidoParaId>
      <d:EstadoDelVirus>16607</d:EstadoDelVirus>
      <d:EsLaVersiónActual m:type="Edm.Boolean">true</d:EsLaVersiónActual>
      <d:Owshiddenversion m:type="Edm.Int32">3</d:Owshiddenversion>
      <d:Versión>1.0</d:Versión>
    </m:properties>
  </entry>
</feed>
 

Мне нужен атрибут «src» внутри «содержимого», который содержит URL-адрес файла, чтобы я мог его загрузить.

Ответ №1:

Вам необходимо включить пространство имен при поиске потомка. Например,

 using (StringReader s = new StringReader(result)) 
{
    var xDoc = XDocument.Load(s);
    XNamespace ns = "http://www.w3.org/2005/Atom";
    var filterXml = xDoc.Descendants(ns "content").First();
    var url = filterXml.Attribute("src").Value;
}
 

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

После фильтрации потомков вы можете получить значение требуемого атрибута с помощью .Attribute("src").Value

ДЕМОНСТРАЦИЯ

Комментарии:

1. @Jaracara11 Рад, что это помогло. Пожалуйста, отметьте это как ответ / полезный, чтобы он мог помочь кому-либо с подобной проблемой