Witam, proszę o pomoc przy odczytaniu zawartości poniższego pliku XML. To jest tylko część pliku. Chciałbym np. odczytać pełen adres.
<?xml version="1.0" encoding="utf-8"?> <emcstotrader xmlns="http://www.mf.gov.pl/schematy/EMCSPL2/EMCS-TRADER/2016/03/"> <message> <ie801:ie801 xmlns:ie801="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE3:IE801:V1.76" xmlns:tms="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE3:TMS:V1.76"> <ie801:header> <tms:messagesender> NDEA.PL </tms:messagesender> <tms:messagerecipient> PL12345678 </tms:messagerecipient> <tms:dateofpreparation> 2018-01-11 </tms:dateofpreparation> <tms:timeofpreparation> 14:35:04.6341889 </tms:timeofpreparation> <tms:messageidentifier> PL#IE801#80285467 </tms:messageidentifier> </ie801:header> <ie801:body> <ie801:eadcontainer> <ie801:consigneetrader language="pl"> <ie801:traderid> PL12345678 </ie801:traderid> <ie801:tradername> FIRMA S.A. </ie801:tradername> <ie801:streetname> ULICA </ie801:streetname> <ie801:streetnumber> 60 </ie801:streetnumber> <ie801:postcode> 02-999 </ie801:postcode> <ie801:city> WARSZAWA </ie801:city>Np tak
XDocument xdoc = XDocument.Load("e:\\forumtest.xml");
XNamespace ns = "http://www.mf.gov.pl/schematy/EMCSPL2/EMCS-TRADER/2016/03/";
XNamespace ns1 = "urn:publicid:-:EC:DGTAXUD:EMCS:PHASE3:IE801:V1.76";
var cl = xdoc.Descendants().Where(x=>x.Name == ns1+"consigneetrader").FirstOrDefault();
var traderid = cl.Element(ns1+"traderid").Value;
var tradernamed = cl.Element(ns1+"tradername").Value;
var streetname = cl.Element(ns1+"streetname").Value;
var streetnumber = cl.Element(ns1+"streetnumber").Value;
var postcode = cl.Element(ns1+"postcode").Value;
var city = cl.Element(ns1+"city").Value;
Albo można użyć protobuf
Link
jacek.placek napisał(a):
Np tak
XDocument xdoc = XDocument.Load("e:\\forumtest.xml"); XNamespace ns = "http://www.mf.gov.pl/schematy/EMCSPL2/EMCS-TRADER/2016/03/"; XNamespace ns1 = "urn:publicid:-:EC:DGTAXUD:EMCS:PHASE3:IE801:V1.76"; var cl = xdoc.Descendants().Where(x=>x.Name == ns1+"consigneetrader").FirstOrDefault(); var traderid = cl.Element(ns1+"traderid").Value; var tradernamed = cl.Element(ns1+"tradername").Value; var streetname = cl.Element(ns1+"streetname").Value; var streetnumber = cl.Element(ns1+"streetnumber").Value; var postcode = cl.Element(ns1+"postcode").Value; var city = cl.Element(ns1+"city").Value;
mam błąd
System.NullReferenceException: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”
cl było null.
Witam, dzięki za pomoc - działa. A czy można odwołać się poprzez np. ie801:EADContainer do danych zagnieżdżonych niżej?
Chyba do końca nie rozumiem pytania
Taki kod
var cl = xdoc.Descendants().Where(x=>x.Name == ns1+"consigneetrader").FirstOrDefault();
zwróci Ci pierwszy element consigneetrader w dokukumencie
a taki kolekcję elementów consigneetrader.
var cls = xdoc.Descendants().Where(x=>x.Name == ns1+"consigneetrader");
Możesz też wyszukać ie801:EADContainer
var cl = xdoc.Descendants().Where(x=>x.Name == ns1+"EADContainer").FirstOrDefault();
albo inaczej, przez pełniejszą ścieżkę. Pogooglaj linq to xml.
Samo Descendants() chyba nie jest najwydajniejsze i pewnie lepiej byłoby przejść tam przez pełną ścieżkę co pozwoli na lepsza kontrolę tego co wyszukasz. Trzeba pamiętać, że jak masz zdefiniowane namespace w elementach xml (ie801:...) to trzeba ich też używać w zapytaniach dlatego jest ns+"nazwaelementu". Generalnie zainstaluj (jeśli nie masz) LINQPad-a tam jest fajny Dump() i ładnie i szybko widać co zwraca zapytanie.