Mam starsze formaty plików, które konwertuję do formatu XML w celu przetworzenia. Strukturę można podsumować następująco:LXML - sortowanie znaczników Kolejność sortowania
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
Część numeryczna znaczników może mieć od 01 do 99 i mogą występować przerwy. W ramach przetwarzania niektóre rekordy mogą zawierać dodatkowe znaczniki. Po zakończeniu przetwarzania konwertuję plik z powrotem do wcześniejszego formatu, podążając za drzewem. Pliki są dość duże (~ 150 000 węzłów).
Problem polega na tym, że niektóre programy, które używają starszego formatu, zakładają, że znaczniki (lub pola w momencie ich konwersji) będą w porządku alfabetycznym, ale domyślnie nowe znaczniki zostaną dodane na końcu gałąź, która powoduje, że wychodzą z iteratora w niewłaściwej kolejności.
Mogę użyć xpath do znalezienia poprzedniego rodzeństwa na podstawie nazwy znacznika za każdym razem, gdy przychodzę, aby dodać nowy tag, ale moje pytanie brzmi, czy istnieje prostszy sposób posortowania drzewa na raz tuż przed eksportem?
Edytuj:
Myślę, że podsumowałem już strukturę.
Rekord może zawierać kilka poziomów, jak opisano powyżej, aby dać coś takiego:
<X>
<X01>1</X01>
<X02>2</X02>
<X03>3</X03>
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
<B>
<B01>Z</B02>
<B02>X</B02>
<B03>C</B03>
</B>
</X>
nie jestem taki pewien schemat XML jest bardzo dobrze przemyślane. Czy A01 i A02 nie są tego samego typu? Powinny mieć tę samą nazwę elementu. Numer powinien być atrybutem, a nie częścią nazwy znacznika. Ponadto nazwy znaczników powinny być bardziej czytelne niż to, oczywiście, ale zdaję sobie sprawę, że mogą być tylko przykładem. –
Niestety, nie mam kontroli nad dotychczasowym formatem i jest to bezpośrednie tłumaczenie sposobu przechowywania danych w parach klucz/wartość. W oryginalnym pliku może to być "A01 = Bob", a aplikacje wiedzą, że numer zawiera imię. – George
Istnieje wiele sposobów na wdrożenie tego w XML, ale ten, który tu pokazałeś, nie jest bardzo semantycznym tłumaczeniem. Twój schemat będzie skomplikowany i ciągle się zmienia. Proponuję '- wartość
' gdzie item jest tym, co reprezentuje A01, A02. –