Я пытаюсь получить данные из 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;
}
}
}