freidenker: Unklare Struktur

Ich versuche für folgende Liste eine XML Struktur zu erarbeiten:

Kundenliste

Berlin

Kunde: 1
         Name: Böhme
         Adresse: Mitte 2
   Kunde: 2
         Name: Schmidt
         Adresse: Rasenweg 4

Dortmund

Kunde: 1
         Name: Berger
         Adresse: Westfahlenweg 4
----------------------------
Mein Lösungsansatz:

<kundenliste>
<bezeichnung>Kundenliste</bezeichnung>
<Ort id="Berlin">

<Kunden id="1">
<Name>Böhme</Name>
<Adresse>Mitte 2</Adresse>

</Kunden>

<Kunden id="2">
<Name>Schmidt</Name>
<Adresse>Rasenweg 4</Adresse>

</Kunden>
</Ort>

<Ort id="Dortmund">

<Kunden id="1">
<Name>Berger</Name>
<Adresse>Westfahlenweg 4</Adresse>
</Kunden>
</Ort>

</kundenliste>

Ich vermute, dass diese Struktur nicht funktioniert, weil bei Kunden und Ort eine id vorkommt? Weiß jemand mit etwas mehr xml Erfahrung wie ich eine Lösung zu dieser Problemstellung erarbeiten könnte?

MfG

freidenker.

  1. Sers,

    wieso sollte es nicht funktionieren?
    Kunde und Ort sind verschiedene Elemente. Ob deren Attribute den gleichen Namen tragen, ist dem XML Dokument völlig egal. Geparsed wird eh alá:
    finde alle Elemente "Kunden" dessen Attribut "ID" den Wert "1" hat.

    So hoffe das reicht dir, ansonsten google mal etwas nach XML und deren Wohlgeformtheit.

    greetz
    medi

  2. Hi,

    mal ein paar Anregungen, um da semantisch etwas mehr rauszuholen:

    <kundenliste>

    Warum heisst das Ding kundenliste, wenn es doch eine Ortsliste ist?

    <bezeichnung>Kundenliste</bezeichnung>

    Wozu eine Bezeichnung, die ein Element mit seinem eigenen Namen beschreibt? Ausserdem sollte eine Bezeichnung hier, wenn ueberhaupt noetig, eher ein Attribut von <kundenliste> sein. Grund: die Kindelemente einer Kundenliste sind normalerweise Kunden, nicht Bezeichnungen.

    <Ort id="Berlin">

    1.: Warum "Ort" gross? (Das gleiche fuer alle folgenden Elementnamen)

    2.: "Berlin" sollte keine ID sein. Eine ID ist normalerweise eine Nummer oder ein sonstwie gearteter Wert, dessen Funktion lediglich ist, ein Objekt eindeutig zu identifizieren. Berlin gibt mehr Infomrationen als das, naemlich den Ort des Elementes "Ort". Also nenne es angemessen.

    3.: Ich persoenlich wuerde den Ort wiederum nicht als Attribut, sondern als Kindelement angeben. Da gibt es aber (in dem Fall) unter dem Strich kein Richtig und Falsch. Dazu finde ich diese Lektuere ganz brauchbar. Lies es Dir einfach mal durch.

    <Kunden id="1">
    [...]

    1.: Warum Kunden im Plural, wenn der Inhalt einen Kunden beschreibt?

    2.: Welchen Zweck haben die IDs? Wenn sie bestehende (globale) IDs dieser Kunden abbilden, dann sind sie da genau richtig, wenn sie nur die Reihenfolge der Kunden am jeweiligen Ort abbilden sollen, sind es keine IDs und hier ueberfluessig: eine Reihenfolge der Elemente ist durch die Reihenfolge im Dokument gegeben.

    3.: Es empfiehlt sich immer dringend, mehrere gleichartige Elemente, wie hier die Kunden, in ein uebergeordnetes Element zu packen. Dies als Anmerkung, falls ein Ort noch andere Kindelemente besitzt als die Kunden - in Deinem obigen Beispiel war das nicht der Fall, aber ein Element mit dem Namen "ort" sieht nicht wie ein Container fuer eine Liste von Kunden aus. Dieser Container sollte etwa <kundenliste> heissen, und das globale Element sollte nicht so heissen, denn seine Kindelemente sind ja keine Kunden, sondern Orte.

    Mal unter der Annahme, dass es sich um Filialen einer Firma mit entprechenden Kundenstaemmen handelt(?), wuerde ich eher sowas vorschlagen:

      
    <filialliste>  
        <filiale>  
            <ort>Berlin</ort>  
      
            <kundenliste>  
                <kunde>  
                    <name>Böhme</name>  
                    <adresse>mitte 2</adresse>  
                </kunde>  
      
                <kunde>  
                     ...  
                </kunde>  
            </kundenliste>  
        </filiale>  
      
        <filiale>  
            <ort>Dortmund</ort>  
      
             ....  
    
    

    Was haeltst Du davon?

    Viele Gruesse,
    der Bademeister

  3. <Adresse>Westfahlenweg 4</Adresse>

    Hier ist ein Feler.

    Ich halte Bademeisters Vorschläge für sinnvoll, schon allein, weil sie unübersichtlicher sind. Aber das hängt natürlich von Deiner Anwendung ab.

    Ich vermute, dass diese Struktur nicht funktioniert, weil bei Kunden und Ort eine id vorkommt?

    Effektiv gibt es keine Probleme, ein Attribut namens "id" in seinem XML-Dialekt zu nutzen. Es ist nur keine ID im XML-Sinne, es ist nur ein beliebiges Attribut namens "id". XML-ID-Natur hat ein Attribut nicht automatisch, nur weil es so heisst. ID-Natur heisst, dass es in XML-Parsern als ID verarbeitet wird und man es hinterher z.B. in DOM-Applikationen mittels document.getElementById("dings") bzw. in XPath mit id() zu finden ist.

    Der Weg, ein beliebig benanntes Attribut mit ID-Natur auszustatten, geht über Document Type Definitions, die Grammatiken, die das Vokabular des eigenen XML-Dialekts maschinenlesbar definieren können. Dieses SELFHTML-Beispiel stattet das Attribut "isbn" mit ID-Natur aus. Das Problem ist aber, dass man die DTD inline in seinem XML-Dialekt ausliefern oder referenzieren muss. Und der XML-Parser muss ein validierender XML-Parser sein; einer, der die DTDs beachtet. Die meisten sind das nicht, z.B. Webbrowser machen das meist nicht.

    Oder man nutzt das Attribut xml:id. Effektiv ist das ein ID-Attribut (im vordefinierten Namensraum mit dem Prefix "xml"), dass in allen XML-Dialekten zur Verfügung stehen sollte, ohne, dass man groß was definieren muss. Viele Parser haben das auch implementiert.