Как читать XML данные, которые находятся внутри указанных c тегов с XmlReader в C# - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь получить данные из XML файлов, которые являются счетами. Файлы длинные и сложные, одни и те же теги используются в разных местах файла. Он также не является постоянным, например, в счете-фактуре есть строка для всех скидок, а в другом счете-фактуре XML не меняется. Я использую XMLReader для чтения файлов, но мне действительно трудно, так как XML меняется для каждого счета-фактуры (разное количество налогов, разное количество скидок, пустые значения в случае поступления и т. Д. c).

Сейчас я в основном использую ReadToFollowing и ReadToDescendant, но я подумал, что моя работа была бы намного проще, если бы я мог командовать XMLReader, чтобы он мог прочитать значение, которое находится в (tag1 / tag2 / tag3, valuename) вместо простого присвоения ему значения например.

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

Это та часть, где все усложняется, а до этой части она довольно устоявшаяся c:

</cac:PaymentTerms>
<cac:TaxTotal>
    <cbc:TaxAmount currencyID="TRY">282.63</cbc:TaxAmount>
    <cac:TaxSubtotal>
        <cbc:TaxableAmount currencyID="TRY">1570.14</cbc:TaxableAmount>
        <cbc:TaxAmount currencyID="TRY">282.63</cbc:TaxAmount>
        <cbc:Percent>18.00</cbc:Percent>
        <cac:TaxCategory>
            <cac:TaxScheme>
                <cbc:Name>KDV</cbc:Name>
                <cbc:TaxTypeCode>0015</cbc:TaxTypeCode>
            </cac:TaxScheme>
        </cac:TaxCategory>
    </cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="TRY">2867.34</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="TRY">1570.14</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="TRY">1852.77</cbc:TaxInclusiveAmount>
    <cbc:AllowanceTotalAmount currencyID="TRY">1297.20</cbc:AllowanceTotalAmount>
    <cbc:ChargeTotalAmount currencyID="TRY">0.00</cbc:ChargeTotalAmount>
    <cbc:PayableAmount currencyID="TRY">1852.77</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:Note>
    </cbc:Note>
    <cbc:InvoicedQuantity unitCode="NIU">6</cbc:InvoicedQuantity>
        <cbc:LineExtensionAmount currencyID="TRY">1519.74</cbc:LineExtensionAmount>
        <cac:AllowanceCharge>
            <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
            <cbc:AllowanceChargeReason>İndirim</cbc:AllowanceChargeReason>
            <cbc:MultiplierFactorNumeric>0.350000</cbc:MultiplierFactorNumeric>
            <cbc:Amount currencyID="TRY">985.93</cbc:Amount>
            <cbc:BaseAmount currencyID="TRY">2816.94</cbc:BaseAmount>
        </cac:AllowanceCharge>
        <cac:AllowanceCharge>
            <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
            <cbc:AllowanceChargeReason>İndirim</cbc:AllowanceChargeReason>
            <cbc:MultiplierFactorNumeric>0.170000</cbc:MultiplierFactorNumeric>
            <cbc:Amount currencyID="TRY">311.27</cbc:Amount>
            <cbc:BaseAmount currencyID="TRY">1831.00</cbc:BaseAmount>
        </cac:AllowanceCharge>
  <cac:TaxTotal>
  <cbc:TaxAmount currencyID="TRY">273.55</cbc:TaxAmount>
    <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="TRY">1519.74</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="TRY">273.55</cbc:TaxAmount>
    <cbc:Percent>18.00</cbc:Percent>
     <cac:TaxCategory>
      <cac:TaxScheme>
        <cbc:Name>KDV</cbc:Name>
        <cbc:TaxTypeCode>0015</cbc:TaxTypeCode>
      </cac:TaxScheme>
    </cac:TaxCategory>
    </cac:TaxSubtotal>
    </cac:TaxTotal>
  <cac:Item>
  <cbc:Description>600-9 12PR  </cbc:Description>
  <cbc:Name>ozname</cbc:Name>
  <cbc:BrandName>011</cbc:BrandName>
  <cac:SellersItemIdentification>
    <cbc:ID>oz</cbc:ID>
  </cac:SellersItemIdentification>
  <cac:CommodityClassification>
    <cbc:ItemClassificationCode>FORKLİFT</cbc:ItemClassificationCode>
  </cac:CommodityClassification>
</cac:Item>
<cac:Price>
  <cbc:PriceAmount currencyID="TRY">469.4900</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>
 <cac:InvoiceLine> 

Как видите, теги Tax Total используются в разных местах ( Тег строки счета-фактуры представляет собой строку для проданного товара, а первый тег общей суммы налога представляет общую сумму налога. Также может быть несколько тегов общей суммы налога, если существует несколько различных налоговых процентов. Тег AllowanceCharge иногда можно найти непосредственно перед </cac:PaymentTerms> тег, представляющий пустую строку со всеми скидками. Мне нужен способ, чтобы разобрать эту динамику c XML, и я не думаю, что смогу сделать это просто с помощью "ReadToFollowing". Если тега AllowanceCharge нет в начале после тега Условия оплаты он читает AllowanceCharge внутри тега InvoiceLine, что является ошибкой. Любая помощь очень ценится. Спасибо

Это мой код:

while(xreader.Read())
{   
    // only the part that is problematic is shown here.
    if (faturaodemekosuluokundumu == false && xtr.Name == "cac:PaymentTerms") 
    {
        if (xtr.ReadToDescendant("cbc:Note"))
        { //KDV YÜZDESİ
            Console.WriteLine("ödeme koşulu");
            Console.WriteLine(xtr.ReadElementContentAsString());
            faturaodemekosuluokundumu = true;
        }
    }

    if (faturaiskontookundumu == false && xtr.Name == "cac:AllowanceCharge") //İSKONTO (1DEN FAZLA OLABİLİR) //eklenmiş iskonto satırı yok demek eğer taxtotal önce bulunursa
    {
        while (xtr.ReadToFollowing("cac:AllowanceCharge"))
        {
            if (xtr.ReadToDescendant("cbc:ChargeIndicator"))
            {
                Console.WriteLine("iskonto");
                Console.WriteLine(xtr.ReadElementContentAsString());
            }

            if (xtr.ReadToFollowing("cbc:AllowanceChargeReason"))
            { //MALZEME HİZMET AÇIKLAMASI
                Console.WriteLine("malzeme hizmet açıklaması");
                Console.WriteLine(xtr.ReadElementContentAsString());
            }

            if (xtr.ReadToFollowing("cbc:MultiplierFactorNumeric"))
            { //yüzde iskonto 0.3 gibi
                Console.WriteLine("iskonto yüzde");
                Console.WriteLine(xtr.ReadElementContentAsString());
            }

            if (xtr.ReadToFollowing("cbc:Amount"))
            {
                string attribute = xtr["currencyID"];

                if (attribute != null)
                {
                    if (attribute == "TRY")
                    {
                        Console.WriteLine("iskonto miktarı try");
                        Console.WriteLine(xtr.ReadElementContentAsString());
                    }
                }
            }

            if (xtr.ReadToFollowing("cbc:BaseAmount"))
            {
                string attribute = xtr["currencyID"];

                if (attribute != null)
                {
                    if (attribute == "TRY")
                    {
                        Console.WriteLine("iskonto yapılan tutar miktarı try");
                        Console.WriteLine(xtr.ReadElementContentAsString());
                    }
                }
            }
        }

        faturaiskontookundumu = true;
    }

    if (faturavergitutariokundumu == false && xtr.Name == "cac:TaxSubtotal") //VERGİLER
    {
        if (xtr.ReadToDescendant("cbc:TaxAmount"))
        {
            Console.WriteLine("kdv tutarı");
            Console.WriteLine(xtr.ReadElementContentAsString());
            faturavergitutariokundumu = true;
        }

        if (faturakdvyuzdesiokundumu == false)
        {
            xtr.ReadToFollowing("cbc:Percent"); //KDV YÜZDESİ
            Console.WriteLine("kdv yüzdesi");
            Console.WriteLine(xtr.ReadElementContentAsString());
            faturakdvyuzdesiokundumu = true;
        }
    }

    if (faturaaratoplamokundumu == false && xtr.Name == "cac:LegalMonetaryTotal") //FATURA TUTARI VE ARATOPLAM
    {
        xtr.ReadToFollowing("cbc:TaxExclusiveAmount"); //KDV YÜZDESİ
        Console.WriteLine("aratoplam");
        Console.WriteLine(xtr.ReadElementContentAsString());
        faturaaratoplamokundumu = true;

        if (faturatutariokundumu == false)
        {
            xtr.ReadToFollowing("cbc:TaxInclusiveAmount");
            Console.WriteLine("faturatutarı");
            Console.WriteLine(xtr.ReadElementContentAsString());
            faturatutariokundumu = true;
        }
    } 
}
...