Nagłówek w XML-u w odpowiedniej kolejności

Nagłówek w XML-u w odpowiedniej kolejności
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 466
0

Cześć,
próbuję wygenerować dokument XML w następującej postaci:

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<KEDU wersja_schematu="1"
      xmlns="http://www.zus.pl/2022/KEDU_5_5"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.zus.pl/2022/KEDU_5_5 kedu_5_5.xsd">
	<naglowek.KEDU>
		<program>

Zrobiłem coś takiego:

Kopiuj
XNamespace xmlns = "http://www.zus.pl/2022/KEDU_5_5";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace schemaLocation = "http://www.zus.pl/2022/KEDU_5_5 kedu_5_5.xsd";

XDocument xDoc = new XDocument(
	new XDeclaration("1.0", "UTF-8", null),
		new XElement(xmlns + "KEDU",
		new XAttribute("wersja_schematu", "1"),

	new XAttribute(XNamespace.Xmlns + "xsi", xsi),
	new XAttribute(xsi + "schemaLocation", schemaLocation)
	));

I jest prawie dobrze, ale w złej kolejności...
Czy może mi ktoś wskazać jak zrobić, aby to było identyczne?
Z góry dziękuję za pomoc.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
6

Z tego co mi wiadomo kolejność elementów w XML - u nie ma znaczenia, chyba, że ją wymusisz. Więcej:
https://stackoverflow.com/questions/4328867/does-xml-care-about-the-order-of-elements

99xmarcin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2420
1

Jedyna rada tutaj to popatrzeć w źródła lub dbg jak te atrybuty są generowane, wtedy wyjdzie co jest nie tak.

Generalnie rozsądna lib'ka do XML generuje atrybuty w takiej kolejności w jakiej są przekazane no chyba że przekazuje się coś unordered np. hashMap'ę.

Kod tam taki że bleh....

Kopiuj
        /// <summary>
        /// Gets the first attribute of an element.
        /// </summary>
        public XAttribute FirstAttribute {
            get { return lastAttr != null ? lastAttr.next : null; }
        }

First, last? Kto by się przejmował (wygląda na circular buffer, czyli linked list gdzie ostatni elem wskazuje na pierwszy).

Niemniej wygląda na to że kolejność jest zachowywana. Także lepiej sprawdź swój kodzik.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
1

Ale faktycznie Płatnik ci tego nie przyjmuje, czy z jakiś innych powodów chcesz wymusić kolejność?

Ze swojej strony polecę chilkat xml odkąd używam jakoś nie mogę wrócić do .net obiektów.

No i możesz sobie wygenerować kod do tworzenia xmla: https://tools.chilkat.io/xmlCreate

KL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 606
2

Kolejnosc elementow jeszcze bylbym w stanie zrozumiec, ale ty tutaj chcesz wymuszac kolejnosc atrybutow?
A komu to potrzebne? A dlaczego?

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 466
0

Dziękuję wszystkim za odpowiedzi.
Kolejność atrybutów faktycznie nie miała w tym wypadku znaczenia - dokumenty zostały przyjęte przez program.

Pytanie pozostaje jednak otwarte, ale już bardziej dla mojego spokoju :). Tak na prawdę to pytanie sprowadza się do tego: jak utworzyć atrybuty, aby xmlns był na początku (obecnie ten atrybut zawsze jest na końcu) - z dwoma kolejnymi jest już dużo prościej.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
2

Teraz dopiero spojrzałem, że ty NIE tworzysz w kodzie atrybutu xmlns to framework Ci go dodaje bo tak masz zdefiniowny węzeł KEDU. Skoro kolejnośc ma być jak chcesz to musisz go dodać samemu:

Kopiuj
XNamespace xmlns = "http://www.zus.pl/2022/KEDU_5_5";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace schemaLocation = "http://www.zus.pl/2022/KEDU_5_5 kedu_5_5.xsd";

XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
        new XElement(xmlns + "KEDU",
        new XAttribute("wersja_schematu", "1"),
        new XAttribute("xmlns", "http://www.zus.pl/2022/KEDU_5_5"),
    new XAttribute(XNamespace.Xmlns + "xsi", xsi),
    new XAttribute(xsi + "schemaLocation", schemaLocation)
    ));

wtedy na wyjściu dostaniesz:

Kopiuj
<KEDU
    wersja_schematu="1"
    xmlns="http://www.zus.pl/2022/KEDU_5_5"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zus.pl/2022/KEDU_5_5 kedu_5_5.xsd" />

https://learn.microsoft.com/en-us/dotnet/standard/linq/create-document-namespaces-csharp#example-create-a-document-that-has-two-namespaces-one-with-a-prefix

Zobacz jak to się zachowa jak nie będziesz dodawał przestrzeni nazw w kodzie:

Kopiuj
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);

Wynik

Kopiuj
<Root xmlns="http://www.adventure-works.com">
  <Child xmlns="www.fourthcoffee.com">
    <DifferentChild xmlns="http://www.adventure-works.com">other content</DifferentChild>
  </Child>
  <Child2>c2 content</Child2>
  <Child3 xmlns="www.fourthcoffee.com">c3 content</Child3>
</Root>
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 466
0

@Panczo dziękuję Ci bardzo! Właśnie o to mi chodziło :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.