Odczytanie XML-a - pusta wartość

0

Cześć,
mam plik w xml-u, który zaczyna się tak:

<?xml version="1.0" encoding="UTF-8"?>
<JPK xmlns="http://jpk.mf.gov.pl/wzor/2019/09/27/09271/" xmlns:ns2="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2018/08/24/eD/DefinicjeTypy/">
  <Naglowek>
    <KodFormularza kodSystemowy="JPK_FA (3)" wersjaSchemy="1-0">JPK_FA</KodFormularza>
    <WariantFormularza>3</WariantFormularza>
    <CelZlozenia>1</CelZlozenia>
    <DataWytworzeniaJPK>2019-12-11T19:45:07.211+01:00</DataWytworzeniaJPK>
    <DataOd>2019-11-01</DataOd>
    <DataDo>2019-11-30</DataDo>
    <KodUrzedu>1440</KodUrzedu>
  </Naglowek>
  <Podmiot1>
<IdentyfikatorPodmiotu>
      <ns2:NIP>xxxxxxxxxxxx</ns2:NIP>
      <ns2:PelnaNazwa>Sozo Spółka Z Ograniczoną Odpowiedzialnością Spółka Komandytowa</ns2:PelnaNazwa>
    </IdentyfikatorPodmiotu>
...

Próbuję odczytać przykładową wartość w następujący sposób:

	string fileName = "I:/JPKFA/JPKFA.xml";
	XDocument doc = XDocument.Load(fileName);

	var kod = doc.Element("JPK").Element("Naglowek").Element("KodFormularza").Value;
	//lub
	var nip = doc.Element("JPK").Element("Podmiot1").Element("IdentyfikatorPodmiotu").Element("ns2:NIP").Value;

Ale wywala mi wyjątek, że "System.Xml.Linq.XContainer.Element(...) zwrócił null". Czy ktoś się orientuje gdzie robię błąd?
Będę wdzięczny za pomoc!.

1

Twój XML ma przestrzenie nazw, spróbuj tak:

XNamespace ns = "http://jpk.mf.gov.pl/wzor/2019/09/27/09271/";
var kod = doc.Element(ns + "JPK").Element(ns + "Naglowek").Element(ns + "KodFormularza").Value;
0

@Ktos, dziękuję, wydobycia nagłówka działa.
Niestety mam jeszcze problem z wydobyciem NIP-u, którego element nazywa się "ns2:NIP" :(
Próbowałem zrobić to przez ns + "ns2:NIP", samo "ns2:NIP", i obie wersje bez ns + - wszystko wywala wyjątek. Mógłbyś mi jeszcze w tym pomóc? Z góry dziękuję!
A przy okazji (to zapewne znajdę w google, ale może również wiesz) jak wydobyć tą przestrzeń nazw bezpośrednio z pliku xml?

0

A nie łatwiej skorzystać sobie z opcji utworzenia klasy z XMLa (Paste Special), zdeserializować i operować sobie na obiekcie? A nie przejmować się zagnieżdżeniem elementów?

0

@litrmleka ale ja nie mam problemu z zagnieżdżonymi elementami tylko z ich odczytem.

1

Prawie identycznie:

XNamespace ns = "http://jpk.mf.gov.pl/wzor/2019/09/27/09271/";
XNamespace ns2 = "http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2018/08/24/eD/DefinicjeTypy/";

var nip = doc.Element(ns + "JPK").Element(ns + "Podmiot1").Element(ns + "IdentyfikatorPodmiotu").Element(ns2 + "NIP").Value;

te ns2: nie wchodzą w skład nazwy elementu, są tylko definicją, że pochodzi on z innej przestrzeni nazw, które masz zdefiniowane w elemencie głównym twojego XML-a.

Domyślną przestrzeń nazw pobierzesz przez:

var rootDefaultXmlns = doc.Root.GetDefaultNamespace();

Ale nie wiem jak pobrać wszystkie prefiksowe - pewnie iterując po atrybutach głównego elementu.

0

@Ktos bardzo Ci dziękuję! Funkcję GetDefaultNamespace() znalazłem już wcześniej w google'a ale nie mogłem ogarnąć tych przestrzeni nazw... W ogóle nie zwróciłem uwagi, że tam są dwie przestrzenie nazw a Ty odnosiłeś się do pierwszej ;)
Jeszcze raz bardzo dziękuję!

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