Czytanie pliku XML

0

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>
0

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;


0

Albo można użyć protobuf
Link

0
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.

0

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?

screenshot-20180227103421.png

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1