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

0

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

<?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:

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.

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

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

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

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

2

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

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.

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:

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:

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

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

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

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

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