Чтение данных в CDATA - PullRequest
0 голосов
/ 27 мая 2020

Я не знаю, может ли кто-нибудь мне помочь. Я работаю в c #, и у меня есть xml вроде следующего:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<autorizacion>
  <estado>AUTORIZADO</estado>
  <numeroAutorizacion>0105202001179184765200120010010144295491442954919</numeroAutorizacion>
  <fechaAutorizacion>2020-05-01T00:29:47-05:00</fechaAutorizacion>
  <ambiente>PRODUCCIÓN</ambiente>
  <comprobante>
    <![CDATA[<?xml version="1.0" encoding="utf-8" standalone="no"?>
      <factura id="comprobante" version="1.1.0">
        <infoTributaria>
          <ambiente>2</ambiente>
          <tipoEmision>1</tipoEmision>
          <razonSocial>Servicios de Telecomunicaciones SETEL S.A.</razonSocial>
          <nombreComercial>Setel</nombreComercial>
          <ruc>1791847652001</ruc>
          <claveAcceso>0105202001179184765200120010010144295491442954919</claveAcceso>
          <codDoc>01</codDoc>
          <estab>001</estab>
          <ptoEmi>001</ptoEmi>
          <secuencial>014429549</secuencial>
          <dirMatriz>AV. ELOY ALFARO N44-406 Y DE LAS HIGUERAS EDIF.GRUPO TVCABLE</dirMatriz>
        </infoTributaria>
        <infoFactura>
          <fechaEmision>01/05/2020</fechaEmision>
          <contribuyenteEspecial>1308</contribuyenteEspecial>
          <obligadoContabilidad>SI</obligadoContabilidad>
          <tipoIdentificacionComprador>04</tipoIdentificacionComprador>
          <razonSocialComprador>INMOBILIARIA VINMOBI CIA LTDA</razonSocialComprador>
          <identificacionComprador>0190332799001</identificacionComprador>
          <direccionComprador>AZUAY - CUENCA - LAS PENCAS II - URBANO | AV. ORDOÑEZ LAZO #S/N Y DE LA HIGUERILLA |</direccionComprador>
          <totalSinImpuestos>186.90</totalSinImpuestos>
          <totalDescuento>0.00</totalDescuento>
          <totalConImpuestos>
            <totalImpuesto>
              <codigo>2</codigo>
              <codigoPorcentaje>2</codigoPorcentaje>
              <baseImponible>186.90</baseImponible>
              <tarifa>12.00</tarifa>
              <valor>22.43</valor>
            </totalImpuesto>
          </totalConImpuestos>
          <propina>0.00</propina>
          <importeTotal>209.33</importeTotal>
          <moneda>DOLAR</moneda>
          <pagos>
            <pago>
              <formaPago>20</formaPago>
              <total>209.33</total>
              <plazo>10</plazo>
              <unidadTiempo>dias</unidadTiempo>
            </pago>
          </pagos>
        </infoFactura>
        <detalles>
          <detalle>
            <codigoPrincipal>940-0000012-500034</codigoPrincipal>
            <descripcion>Servicio Internet Corporativo - TVCABLE PROFESIONAL 120 F 2:1</descripcion>
            <cantidad>1.00</cantidad>
            <precioUnitario>185.90</precioUnitario>
            <descuento>0.00</descuento>
            <precioTotalSinImpuesto>185.90</precioTotalSinImpuesto>
            <detallesAdicionales>
              <detAdicional nombre="Desde" valor="0"/>
              <detAdicional nombre="Hasta" valor="0"/>
              <detAdicional nombre="Categoria" valor="INTERNET|(IVA)"/>
            </detallesAdicionales>
            <impuestos>
              <impuesto>
                <codigo>2</codigo>
                <codigoPorcentaje>2</codigoPorcentaje>
                <tarifa>12.00</tarifa>
                <baseImponible>185.90</baseImponible>
                <valor>22.31</valor>
              </impuesto>
            </impuestos>
          </detalle>
        </detalles>
      </factura>
    ]]>
  </comprobante>
  <mensajes/>
</autorizacion>

это часть xml, поэтому мне нужно поместить в текстовое поле значения, которые находятся внутри CDATA, например <ruc>, <razonSocial> и так далее. Я использовал этот код для чтения данных за пределами CDATA, и он отлично работал.

string Ruta = "";
            OpenFileDialog EscogerRuta = new OpenFileDialog { Filter = "XLM (*.xml)|*.xml", FilterIndex = 1, Multiselect = false };
            if (EscogerRuta.ShowDialog() == DialogResult.OK)
                Ruta = EscogerRuta.FileName;
            if (Ruta != "")
            {
                XmlDocument Documento = new XmlDocument();
                Documento.Load(Ruta);

                string valor = Documento.DocumentElement.SelectSingleNode("/autorizacion/estado").InnerText;
                if (valor == "AUTORIZADO")
                {
                    TxtAutorizacion.Text = Documento.DocumentElement.SelectSingleNode("/autorizacion/numeroAutorizacion").InnerText;
                }
            }

1 Ответ

0 голосов
/ 27 мая 2020

Вам нужно два шага синтаксического анализа. Сначала проанализируйте внешний документ, как обычно. Это создает дерево, в котором содержимое comprobante содержится в одном текстовом узле. Получить строковое значение этого текстового узла и вызвать синтаксический анализатор XML, чтобы проанализировать его как XML; Итак, теперь у вас есть внутренний проанализированный XML документ, по которому вы можете перемещаться обычным способом.

...