W pracy jesteśmy proszeni o utworzenie plików XML w celu przekazania danych do innej aplikacji offline, która następnie utworzy drugi plik XML do przekazania w celu zaktualizowania niektórych naszych danych. W trakcie tego procesu rozmawialiśmy z zespołem drugiej aplikacji o strukturze pliku XML.
Próbka, którą wymyśliłem, jest w zasadzie coś takiego:
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
Drugi zespół powiedział, że nie jest to standard branżowy i że atrybutów należy używać tylko w przypadku metadanych. Zasugerowali:
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
Powodem, dla którego zasugerowałem pierwszy, jest to, że rozmiar utworzonego pliku jest znacznie mniejszy. W pliku będzie około 80000 elementów, które będą znajdować się w pliku podczas przesyłania. Ich sugestia w rzeczywistości okazuje się trzy razy większa niż ta, którą zasugerowałem. Szukałem tajemniczego „standardu przemysłowego”, o którym wspomniano, ale najbliższe, jakie mogłem znaleźć, było to, że atrybuty XML powinny być używane tylko do metadanych, ale powiedziałem, że debata dotyczyła tego, co faktycznie były metadanymi.
Po długim, wyczerpującym wyjaśnieniu (przepraszam), jak określić, co to są metadane, a kiedy projektujesz strukturę dokumentu XML, jak powinieneś zdecydować, kiedy użyć atrybutu lub elementu?
Odpowiedzi:
Używam tej ogólnej zasady:
Więc twój jest blisko. Zrobiłbym coś takiego:
EDYCJA : Zaktualizowałem oryginalny przykład na podstawie opinii poniżej.
źródło
<
jest<
odwołanie do znaku, a nie odwołanie do encji.<
jest OK w atrybutach. Zobacz: w3.org/TR/REC-xml/#sec-predefined-ent]]>
!)Niektóre problemy z atrybutami to:
Jeśli użyjesz atrybutów jako kontenerów danych, powstanie dokument, który jest trudny do odczytania i utrzymania. Spróbuj użyć elementów do opisania danych. Użyj atrybutów tylko w celu dostarczenia informacji, które nie są istotne dla danych.
Nie kończy się w ten sposób (nie tak powinno się używać XML):
Źródło: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp
źródło
list
jest częściowym obejściem tego problemu. Nie może istnieć wiele atrybutów o tej samej nazwie. Zlist
atrybutem nadal ma tylko jedną wartość, która jest białe znaki oddzielone lista niektórych typów danych. Znaki separacji są stałe, więc nie można mieć wielu wartości, jeśli pojedyncza wartość żądanego typu danych może zawierać białe znaki. Wyklucza to prawdopodobieństwo posiadania na przykład wielu adresów w jednym atrybucie „adres”.„XML” oznacza „eXtensible Markup Language”. Język znaczników oznacza, że dane to tekst oznaczony metadanymi dotyczącymi struktury lub formatowania.
XHTML jest przykładem XML wykorzystanego w zamierzony sposób:
Tutaj rozróżnienie między elementami i atrybutami jest jasne. Elementy tekstowe są wyświetlane w przeglądarce, a atrybuty są instrukcje dotyczące sposobu ich wyświetlania (choć istnieje kilka tagów, które nie działają w ten sposób).
Zamieszanie powstaje, gdy XML nie jest używany jako język znaczników, ale jako język serializacji danych , w którym rozróżnienie między „danymi” i „metadanymi” jest bardziej niejasne. Zatem wybór między elementami i atrybutami jest mniej więcej arbitralny, z wyjątkiem rzeczy, których nie można przedstawić za pomocą atrybutów (patrz odpowiedź Feenstera).
źródło
Element XML a atrybut XML
XML polega na porozumieniu. Najpierw odłóż na bok wszelkie istniejące schematy XML lub ustalone konwencje w społeczności lub branży.
Jeśli naprawdę jesteś w sytuacji, aby zdefiniować schemat od podstaw, oto kilka ogólnych uwag, które powinny pomóc w podjęciu decyzji o elemencie a atrybucie :
źródło
Może to zależeć od twojego użytkowania. XML używany do reprezentowania uporządkowanych danych generowanych z bazy danych może działać dobrze, a ostatecznie wartości pól są umieszczane jako atrybuty.
Jednak XML używany jako transport komunikatów często byłby lepszy przy użyciu większej liczby elementów.
Powiedzmy na przykład, że mieliśmy ten kod XML zaproponowany w odpowiedzi: -
Teraz chcemy wysłać element ITEM do urządzenia w celu wydrukowania kodu kreskowego, jednak istnieje wybór rodzajów kodowania. Jak reprezentujemy wymagany typ kodowania? Nagle zdajemy sobie sprawę, z pewnym opóźnieniem, że kod kreskowy nie był pojedynczą wartością automatyczną, ale raczej można go zakodować przy użyciu kodowania wymaganego podczas drukowania.
Chodzi o to, o ile nie budujesz jakiegoś XSD lub DTD wraz z przestrzenią nazw, aby naprawić strukturę w kamieniu, najlepiej może być pozostawienie otwartych opcji.
IMO XML jest najbardziej przydatny, gdy można go zginać, nie niszcząc przy tym istniejącego kodu.
źródło
W projekcie schematu używam następujących wskazówek w odniesieniu do atrybutów vs. elementów:
Preferowane są następujące atrybuty:
Dodałem, gdy jest to technicznie możliwe, ponieważ są chwile, w których użycie atrybutów nie jest możliwe. Na przykład opcje zestawu atrybutów. Na przykład użycie (startDate i endDate) xor (startTS i endTS) nie jest możliwe w bieżącym języku schematu
Jeśli schemat XML zacznie zezwalać na ograniczenie lub rozszerzenie modelu treści „wszystko”, prawdopodobnie go upuszczę
źródło
W razie wątpliwości KISS - po co mieszać atrybuty i elementy, jeśli nie masz wyraźnego powodu, aby używać atrybutów. Jeśli później zdecydujesz się zdefiniować XSD, będzie to również czystsze. Jeśli nawet później zdecydujesz się wygenerować strukturę klas z XSD, będzie to również prostsze.
źródło
Nie ma uniwersalnej odpowiedzi na to pytanie (byłem mocno zaangażowany w tworzenie specyfikacji W3C). XML może być wykorzystywany do wielu celów - dokumenty tekstowe, dane i kod deklaratywny są trzema najbardziej powszechnymi. Używam go również często jako modelu danych. Istnieją aspekty tych aplikacji, w których atrybuty są bardziej powszechne, i inne, w których elementy potomne są bardziej naturalne. Istnieją również funkcje różnych narzędzi, które ułatwiają lub utrudniają ich użycie.
XHTML to jeden obszar, w którym atrybuty mają naturalne zastosowanie (np. W klasie = „foo”). Atrybuty nie mają kolejności, co może ułatwić niektórym osobom opracowanie narzędzi. Atrybuty OTOH są trudniejsze do wpisania bez schematu. Uważam również, że atrybuty przestrzeni nazw (foo: bar = "zork") są często trudniejsze do zarządzania w różnych zestawach narzędzi. Ale spójrz na niektóre języki W3C, aby zobaczyć mieszankę, która jest powszechna. SVG, XSLT, XSD, MathML to niektóre przykłady dobrze znanych języków i wszystkie mają bogatą ofertę atrybutów i elementów. Niektóre języki pozwalają nawet na więcej niż jeden sposób, np
lub
Należy pamiętać, że NIE są one równoważne składniowo i wymagają jawnego wsparcia w narzędziach do przetwarzania)
Radzę zapoznać się z powszechną praktyką w obszarze najbliższym Twojej aplikacji, a także zastanowić się, jakie zestawy narzędzi możesz zastosować.
Na koniec upewnij się, że odróżniasz przestrzenie nazw od atrybutów. Niektóre systemy XML (np. Linq) reprezentują przestrzenie nazw jako atrybuty w interfejsie API. IMO to brzydkie i potencjalnie mylące.
źródło
Inni opisali, jak odróżniać atrybuty od elementów, ale z bardziej ogólnej perspektywy umieszczanie wszystkiego w atrybutach, ponieważ zmniejszanie wynikowego kodu XML jest błędne.
XML nie został zaprojektowany jako kompaktowy, ale przenośny i czytelny dla ludzi. Jeśli chcesz zmniejszyć rozmiar przesyłanych danych, użyj czegoś innego (np. Buforów protokołu Google ).
źródło
pytanie za milion dolarów!
po pierwsze, nie przejmuj się teraz zbytnio wydajnością. Zdziwisz się, jak szybko zoptymalizowany parser XML rozdziera twój xml. co ważniejsze, jaki jest twój projekt na przyszłość: w miarę ewolucji XML, jak utrzymasz luźne połączenie i interoperacyjność?
bardziej konkretnie, możesz sprawić, że model zawartości elementu będzie bardziej złożony, ale trudniej jest rozszerzyć atrybut.
źródło
Obie metody przechowywania właściwości obiektu są całkowicie poprawne. Powinieneś odejść od rozważań pragmatycznych. Spróbuj odpowiedzieć na następujące pytanie:
Która reprezentacja prowadzi do szybszego analizowania / generowania danych?
Która reprezentacja prowadzi do szybszego transferu danych?
Czy czytelność ma znaczenie?
...
źródło
Użyj elementów dla danych i atrybutów dla metadanych (dane o danych elementu).
Jeśli element pojawia się jako predykat w wybranych ciągach znaków, masz dobry znak, że powinien to być atrybut. Podobnie, jeśli atrybut nigdy nie jest używany jako predykat, być może nie są to przydatne metadane.
Pamiętaj, że XML ma być czytelny dla komputera, a nie dla człowieka, a dla dużych dokumentów XML bardzo dobrze kompresuje.
źródło
Jest to dyskusyjne w obu przypadkach, ale twoi koledzy mają rację w tym sensie, że XML powinien być używany do „znaczników” lub metadanych wokół rzeczywistych danych. Ze swojej strony masz rację, ponieważ czasami trudno jest zdecydować, gdzie leży granica między metadanymi i danymi podczas modelowania domeny w XML. W praktyce udaję, że wszystko w znaczniku jest ukryte, a tylko dane poza znacznikiem są czytelne. Czy dokument ma w ten sposób sens?
XML jest powszechnie nieporęczny. W przypadku transportu i przechowywania zaleca się kompresję, jeśli stać Cię na moc przetwarzania. XML kompresuje się dobrze, czasem fenomenalnie dobrze, ze względu na swoją powtarzalność. Miałem kompresję dużych plików do mniej niż 5% ich oryginalnego rozmiaru.
Kolejną kwestią, która powinna wzmocnić twoje stanowisko, jest fakt, że podczas gdy drugi zespół kłóci się o styl (w tym, że większość narzędzi XML poradzi sobie z dokumentem zawierającym wszystkie atrybuty równie łatwo, jak dokument z # PCDATA), argumentujesz o praktyczności. Chociaż stylu nie można całkowicie zignorować, zalety techniczne powinny mieć większy ciężar.
źródło
To w dużej mierze kwestia preferencji. Używam elementów do grupowania i atrybutów danych tam, gdzie to możliwe, ponieważ widzę to jako bardziej kompaktowe niż alternatywa.
Na przykład wolę .....
...Zamiast....
Jeśli jednak mam dane, które nie przedstawiają się łatwo w obrębie powiedzmy 20-30 znaków lub zawierają wiele cudzysłowów lub innych znaków, które wymagają ucieczki, powiedziałbym, że nadszedł czas, aby rozbić elementy ... prawdopodobnie za pomocą bloków CData.
źródło
Co powiesz na skorzystanie z naszej ciężko zarobionej intuicyjnej orientacji na obiekt? Zazwyczaj uważam, że łatwo jest myśleć, który obiekt jest atrybutem obiektu lub do którego obiektu się odnosi.
W zależności od tego, co intuicyjnie ma sens, obiekty powinny pasować jako elementy. Jego atrybuty (lub właściwości) byłyby atrybutami dla tych elementów w XML lub element potomny z atrybutem.
Myślę, że w prostszych przypadkach, takich jak w przykładzie, analogia orientacji obiektu działa dobrze, aby dowiedzieć się, który element jest, a który atrybut elementu.
źródło
Kilka poprawek do niektórych złych informacji:
@John Ballinger: Atrybucje mogą zawierać dowolne dane postaci. <> & „” należy odpowiednio zmienić na „& amp;” i „. Jeśli używasz biblioteki XML, zajmie się tym za Ciebie.
Do diabła, atrybut może zawierać dane binarne, takie jak obraz, jeśli naprawdę chcesz, po prostu kodując go base64 i czyniąc z niego dane: URL.
@feenster: Atrybuty mogą zawierać oddzielone spacjami wiele elementów w przypadku IDS lub NAMES, które mogą zawierać liczby. Nitpicky, ale może to zaoszczędzić miejsce.
Korzystanie z atrybutów może utrzymać konkurencyjność XML-a w JSON. Zobacz Fat Markup: Trimming Fat Markup Mit jedna kaloria na raz .
źródło
Zawsze jestem zaskoczony wynikami tego rodzaju dyskusji. Dla mnie istnieje bardzo prosta reguła decydująca o tym, czy dane należą do atrybutu, czy do treści, i to, czy dane mają podstrukturalną strukturę.
Na przykład tekst bez znaczników zawsze należy do atrybutów. Zawsze.
Listy należą do podstruktury lub treści. Tekst, który z czasem może zawierać osadzoną ustrukturyzowaną pod-treść, należy do treści. (Z mojego doświadczenia wynika, że jest to stosunkowo mało - tekst ze znacznikami - podczas korzystania z XML do przechowywania lub wymiany danych.)
Tak zapisany schemat XML jest zwięzły.
Ilekroć widzę takie przypadki
<car><make>Ford</make><color>Red</color></car>
, myślę sobie: „O rany, czy autor pomyślał, że będą elementy podrzędne w elemencie make?”.<car make="Ford" color="Red" />
jest znacznie bardziej czytelny, nie ma wątpliwości co do sposobu obsługi białych znaków itp.Biorąc pod uwagę tylko zasady obsługi białych znaków, uważam, że taka była wyraźna intencja projektantów XML.
źródło
Jest to bardzo wyraźne w HTML, gdzie wyraźnie widać różnice atrybutów i znaczników:
Jeśli masz tylko czyste dane w formacie XML, różnica jest mniej wyraźna. Dane mogą znajdować się między znacznikami lub jako atrybuty.
=> Większość danych powinna znajdować się pomiędzy znacznikami.
Jeśli chcesz tutaj użyć atrybutów: możesz podzielić dane na dwie kategorie: Dane i „metadane”, w których metadane nie są częścią rekordu, chcesz je przedstawić, ale takie rzeczy jak „wersja formatu”, „data utworzenia” itp.
Można również powiedzieć: „Użyj atrybutów do scharakteryzowania tagu, użyj tagów do dostarczenia danych”.
źródło
Zgadzam się z Feenster. Unikaj atrybutów, jeśli możesz. Elementy są przyjazne dla ewolucji i bardziej interoperacyjne między zestawami narzędzi serwisów internetowych. Nigdy nie znajdziesz tych zestawów narzędzi, które serializują wiadomości z żądaniami / odpowiedzi za pomocą atrybutów. Ma to również sens, ponieważ nasze wiadomości są danymi (a nie metadanymi) dla zestawu narzędzi serwisu internetowego.
źródło
Zaufaj mi z czasem. zawsze trzymam się od nich osobiście z daleka. Elementy są znacznie bardziej wyraźne i czytelne / użyteczne zarówno dla parserów, jak i użytkowników.
Jedynym razem, kiedy ich użyłem, było zdefiniowanie rozszerzenia pliku adresu URL zasobu:
myślę, że jeśli wiesz 100%, atrybut nie musi być rozszerzany, możesz go użyć, ale ile razy to wiesz.
źródło