2009-07-20 8 views
7

Załóżmy, że chcesz pozwolić, aby jakiś konkretny element XML wystąpił 0 lub więcej razy. Na przykład, element <record> może występować wiele razy:Użyj nadrzędnego elementu XML jako kontenera do ponownego pojawiania się elementów potomnych?

<repository> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
</repository> 

Czy istnieją jakiekolwiek istotne powody, aby zawierać element nadrzędny jako kontener dla nich? Na przykład, co następuje wykorzystuje element <recordSet> aby zawierać <record> elementy:

<repository> 
    <recordSet> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
    </recordSet> 
</repository> 

Próbowałam znaleźć jakieś pytania związane pozowanie przed tym, więc przepraszam, jeśli został już poproszony. Z góry dziękuję za wszelkie dane wejściowe!


Edit - 22 lipca 2009:

Dziękujemy wszystkim za wspaniałą odpowiedź! (Chciałbym komentować/głosować na ludzi, ale nie mam jeszcze dość punktów reputacyjnych.) Prawdopodobnie pójdę dalej tą trasą, a także chciałem podziękować @ 16bytesom za ich porady, w tym po prostu nazwać rodzica za pomocą liczby mnogiej powtarzających się elementów potomnych.

Odpowiedz

3

Posiadanie elementu nadrzędnego upraszcza identyfikowanie sekcji kodu XML i upraszcza procesom obsługi odwzorowywanie elementów potomnych do kolekcji. Jeśli masz system, który zabrania używania atrybutów (niektóre robią, to jest denerwujące), musisz również użyć elementów opakowania, aby odróżnić właściwości (takie jak identyfikatory), które należą do określonych dzieci.

Poza tym ważne jest, aby pominąć element rodzica i może sprawić, że plik będzie mniej szczegółowy.

W pierwszym przykładzie, element użytkownik może być zmieszany się z zapisów, to jest ważne, ale może to być trudne do wykrycia:

<repository> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <user>Bill</user> 
    <record>Record 3</record> 
</repository> 

Podczas gdy w okolicy elementu można oddzielić gromadzenia i mieć wiele wystąpień tej kolekcji:

<repositories> 
    <users> 
    <user>Bill</user> 
    </users> 
    <repository> 
    <id>id1</id> 
    <recordSet> 
     <id>recordSet1</id> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    <recordSet> 
     <id>recordSet2</id> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    </repository> 
    <repository> 
    <id>id2</id> 
    <recordSet> 
     <record>Record 1</record> 
     <record>Record 2</record> 
     <record>Record 3</record> 
    </recordSet> 
    </repository> 
</repositories> 
1

który jest użyteczny, jeśli w swojej <repository> chcesz zezwolić na wielokrotne <recordSet> elementów:

<repository> 
    <recordSet id="1"> 
    <record>Record 1</record> 
    <record>Record 2</record> 
    <record>Record 3</record> 
    </recordSet> 
    <recordSet id="2"> 
    <record>Record 2.1</record> 
    <record>Record 2.2</record> 
    <record>Record 2.3</record> 
    </recordSet> 
</repository> 
+0

Musisz zaimportować wartości atrybutów do swojego przykładu. –

+0

@Rich: gotowe. po prostu składałem psuedo-xml – akf

10

pan natknął drugiego z moich zasad prowadzących projekt XML (atrybuty pierwsza istota zastosowanie tylko do identyfikatorów i rzeczywistych metadanych, trzecia istota nie używać nazw, chyba że wiesz co robisz), które próbuję użyć podczas projektowania dokumentów XML.Oprócz tego, że dobra zasada-of-kciuk, ale również sprawia, że ​​dokument:

  • łatwiejsze do modelowania w XML Schema lub innych językach walidacji
    • również łatwiejsze do ponownego wykorzystania złożonego typu
  • łatwiejsze do odczytania (IMHO)
  • ułatwić użytkownikom grok gdy przejeżdżające dokument
  • (ww) łatwiej wiążą się obiektu OOP swojego wyboru

Jedna sugestia, chciałbym spróbować:

<Root> 
    <Items> 
    <Item>a</Item> 
    <Item>b</Item> 
    <Item>c</Item> 
    </Items> 
</Root> 

Prostszy "s" przyrostek jest bardziej zwięzłe i łatwiejsze do zapamiętania i zastosowania. Jeśli użyjesz ogólnej nazwy rzeczownika, ty lub jej kolega zapomnisz, który z nich ostatecznie, więc zobaczysz Zestawy zmieszane z listami wymieszanymi z kontenerem. Ale to bardziej styl niż dobrej praktyki i nie chcę, aby rozpocząć wojnę religijną;)

(UpperCamel elementów !, lowerCamel dla atrybutów --sorry)

2

Chociaż mam też instynktownie preferują zapakowane kolekcje, warto zauważyć, że Google ma inną opinię.

Elementy XML, które zawierają tylko powtarzające się elementy potomne, NIE POWINNY być używane. [Uzasadnienie: Nie są używane w Atomie i nic nie dodają.]

Powiązane problemy