NAV adatXML beolvasás - NullReferenceException

NAV adatXML beolvasás - NullReferenceException
2022-09-29T20:28:06+02:00
2022-11-10T12:32:52+01:00
2022-11-10T12:50:35+01:00
szmolkalaszlo
Sziasztok!

A NAV OL számlázóból letölthető számlaadatokat tartalmazó XML fájlt szeretném feldolgozni.
Nem jártam sok sikerrel, már rögtön az elején itt van egy probléma.
Amikor az egyes elemekben lévő értékeket szeretném visszakapni, az alábbi hibaüzenetbe futok a foreach ciklusban:

System.NullReferenceException: 'Az objektumhivatkozás nincs beállítva semmilyen objektumpéldányra.' System.Xml.Linq.XContainer.Element(...) returned null.

A rövidke kód így nézne ki:

public void NavXML() { XElement xElement = XElement.Load(xmlUtvonal + XmlFajlNev); IEnumerable<XElement> szamlak = xElement.Elements(); XNamespace ns2 = "http://schemas.nav.gov.hu/OSA/3.0/base"; XNamespace ns3 = "http://schemas.nav.gov.hu/dto/invoices"; foreach (var szamla in szamlak) { Console.WriteLine(szamla.Element(ns2 + "taxpayerId").Value); } }
Az xml pedig
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns3:Invoices xmlns="http://schemas.nav.gov.hu/OSA/3.0/data" xmlns:ns2="http://schemas.nav.gov.hu/OSA/3.0/base" xmlns:ns3="http://schemas.nav.gov.hu/dto/invoices"> <ns3:invoice> <invoiceNumber>SZ-2022-0000</invoiceNumber> <invoiceIssueDate>2022-09-08</invoiceIssueDate> <completenessIndicator>false</completenessIndicator> <invoiceMain> <invoice> <invoiceHead> <supplierInfo> <supplierTaxNumber> <ns2:taxpayerId>87654321</ns2:taxpayerId> <ns2:vatCode>1</ns2:vatCode> <ns2:countyCode>99</ns2:countyCode> </supplierTaxNumber> ...
Köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Ha nagyon ragaszkodsz ehhez a fajta kézi XML bűvöléshez, akkor így tudod megszerezni az infókat:

XElement xElement = XElement.Parse(doc); XNamespace ns2 = "http://schemas.nav.gov.hu/OSA/3.0/base"; XNamespace ns3 = "http://schemas.nav.gov.hu/dto/invoices"; IEnumerable<XElement> szamlak = xElement.Descendants(ns3 + "invoice"); foreach (var szamla in szamlak) { Console.WriteLine(szamla.Descendants(ns2 + "taxpayerId").First().Value); }
Sokkal inkább mennék el abba az irányba, hogy deszerializálom az XML dokumentumot:

[XmlRoot(ElementName="supplierTaxNumber", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public class SupplierTaxNumber { [XmlElement(ElementName="taxpayerId", Namespace="http://schemas.nav.gov.hu/OSA/3.0/base")] public string TaxpayerId { get; set; } [XmlElement(ElementName="vatCode", Namespace="http://schemas.nav.gov.hu/OSA/3.0/base")] public string VatCode { get; set; } [XmlElement(ElementName="countyCode", Namespace="http://schemas.nav.gov.hu/OSA/3.0/base")] public string CountyCode { get; set; } } [XmlRoot(ElementName="supplierInfo", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public class SupplierInfo { [XmlElement(ElementName="supplierTaxNumber", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public SupplierTaxNumber SupplierTaxNumber { get; set; } } [XmlRoot(ElementName="invoiceHead", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public class InvoiceHead { [XmlElement(ElementName="supplierInfo", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public SupplierInfo SupplierInfo { get; set; } } [XmlRoot(ElementName="invoice", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public class Invoice { [XmlElement(ElementName="invoiceHead", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public InvoiceHead InvoiceHead { get; set; } } [XmlRoot(ElementName="invoiceMain", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public class InvoiceMain { [XmlElement(ElementName="invoice", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public Invoice Invoice { get; set; } } [XmlRoot(ElementName="invoice", Namespace="http://schemas.nav.gov.hu/dto/invoices")] public class Invoice2 { [XmlElement(ElementName="invoiceNumber", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public string InvoiceNumber { get; set; } [XmlElement(ElementName="invoiceIssueDate", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public string InvoiceIssueDate { get; set; } [XmlElement(ElementName="completenessIndicator", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public string CompletenessIndicator { get; set; } [XmlElement(ElementName="invoiceMain", Namespace="http://schemas.nav.gov.hu/OSA/3.0/data")] public InvoiceMain InvoiceMain { get; set; } } [XmlRoot(ElementName="Invoices", Namespace="http://schemas.nav.gov.hu/dto/invoices")] public class Invoices { [XmlElement(ElementName="invoice", Namespace="http://schemas.nav.gov.hu/dto/invoices")] public List<Invoice2> Invoice2 { get; set; } }
Majd nagyon egyszerűen:

XmlSerializer serializer = new XmlSerializer(typeof(Invoices)); using MemoryStream memorystream = new MemoryStream(Encoding.UTF8.GetBytes(doc)); Invoices res = (Invoices) serializer.Deserialize(memorystream); foreach (Invoice2 ns3invoice in res.Invoice2) { SupplierTaxNumber taxInfo = ns3invoice.InvoiceMain.Invoice.InvoiceHead.SupplierInfo.SupplierTaxNumber; taxInfo.TaxpayerId.Dump(); taxInfo.CountyCode.Dump(); taxInfo.VatCode.Dump(); }
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd