XML - Verständnis |
as_string
Haudegen
![](images/star2.gif) ![](images/star2.gif) ![](images/star2.gif)
Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg
![](images/spacer.gif) |
|
Zitat: |
Original von Karlito
Für die Entscheidung, ob man ein Attribut nimmt oder ein Element, weiß ich tatsächlich nicht, ob es einen formalen Prozess gibt. |
Hallo Karlito!
Ja, das ist mir auch noch nie so ganz klar geworden. Vielleicht erstmal eine Einschränkung: Man kann natürlich technisch nur solche Elemente auch als Attribute darstellen, die nur immer einmalig vorkommen können und deren Reihenfolge auch egal ist (so weit ich weiß muss die Reihenfolge von Attributen beliebig sein, die von Elementen kann (muss aber nicht) relevant sein. Ich kann mich da aber auch irren...).
Dann ist es so eine Sache: Es sollen ja letztlich Datenstrukturen abgebildet werden und es sollte u. U. Entsprechungen zu Datenstrukturen in Programmen existieren. Z. B. wenn man Objekte in XML serialisieren will, dann haben diese ja Attribute (also Member-Variablen) und die können wiederum Collections sein und so. Wenn man erreichen will, dass die Abbildung sowohl von Object in der jeweiligen Programmiersprache nach XML als auch umgekehrt eindeutig ist, einigt man sich auf passende Transformationen. Ich bin mal über so etwas gestolpert, als ich mir SOAP angeschaut habe: Hier werden ja Methoden auf entfernten Systemen aufgerufen, indem dort hin XML übertragen wird und die Antwort auch in XML formuliert ist. Im SOAP-Standard ist deshalb auch definiert, wie die Transformation eines Objekts im Speicher auf die XML-Repräsentation passieren muss und in diesem Rahmen ist dann auch festgelegt, was Attribut und was Element im XML wird.
Ansonsten ist es mE häufig eine Frage, wie das XML weiter verarbeitet werden soll. Häufig ist es programmatisch einfacher, die Attribute eines Elementes abzufragen, also noch zusätzlich über seine Kinder zu iterieren. Deshalb kenne ich es i. A. so, dass alles, was nur einmal für ein Element vorkommen kann (oder muss) und das wirklich ein einfaches Namen-Wert-Paar ist (also keine weiteren Unterlemente mehr vorhanden sein können) dann meistens als Attribut gemacht wird. Also statt so was:
code: |
1:
2:
3:
4:
5:
6:
|
<person>
<firstname>Vorname</firstname>
<lastname>Nachname</lastname>
</person>
|
|
Eher das hier geschrieben wird:
code: |
1:
2:
3:
|
<person firstname="Vorname" lastname="Nachname" />
|
|
Obwohl beides problemlos "funktioniert".
Gruß
Marco
|
|
31.12.2014 15:57 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
![](images/spacer.gif) |
|
Danke abermals für's einspringen, Marco
Ich denke wir beide werden gerne weitere Fragen beantworten. Enrtschuldige bitte die hohe Latenz.
Gruß,
Karlito
|
|
31.12.2014 16:01 |
|
|
123michi19
Mitglied
![](images/star.gif) ![](images/star.gif)
Dabei seit: 22.12.2014
Beiträge: 45
![](images/spacer.gif) |
|
Danke euch beiden
|
|
31.12.2014 16:05 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
![](images/spacer.gif) |
|
@ CDATA und PCDATA:
Ich denke der unterschied ist einfach, dass die eine Variante nicht geparst werden soll und die andere schon. Wie das genau geschieht, ist nicht festgelegt. Ist aber nur eine Vermutung.
@Attribute oder Nicht Attribute:
Ich stimme as_string zu. Es liegt wahrscheinlich einfach im Ermessen des Programmierers. Ich kann mir jedoch gut vorstellen, dass es dafür einen formalen Prozess gibt, den wir nicht kennen.
Gruß,
Karlito
|
|
31.12.2014 16:14 |
|
|
123michi19
Mitglied
![](images/star.gif) ![](images/star.gif)
Dabei seit: 22.12.2014
Beiträge: 45
![](images/spacer.gif) |
|
So ihr lieben XML-Profis
Jetzt habe ich mich einmal an einem Beispiel versucht und wäre Euch für die Überprüfung dankbar.
Finden Sie Fehler und Ungereimtheiten in folgender XML – Datei!
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
<?xml version="1.0" encoding="UTF-12"?>
<Festplatte Modellbezeichnung=ST31000528AS>
<Serie>Barracuda 7200.12</Serie>
<BauForm>3,5 Zoll</Bauform>
<Kapazitaet capacity="1000" einheit="GB">
<Schnittstelle typ="Serial ATA/300" Preis="47,95"/>
<Datentransferrate wert="bis zu 125 MB/s (lesen)" waehrung="EUR"/>
<Geschwindigkeit> <Drehzahl>7200 U/min</Drehzah1>
<Zugriffszeit>8.5 ms (lesen), 9.5 ms (schreiben), Cache 32 MB</Zugriffszeit>
</Festplatte>
<Festplatte Modell="WD10EADS">
<Serie> Caviar Green</Serie>
<Kapazität capacity="1000" einheit="GB">
<BauForm>3,5 Zoll</Bauform>
<Schnittstelle typ="Serial ATA/300" Preis="48,95"/>
<Datentransferrate wert="bis zu 125 MB/s (lesen)" waehrung="EUR"/>
<Geschwindigkeit> <Drehzahl>7200 U/min</Drehzah1>
<Zugriffszeit>8.9 ms (lesen), Cache 32 MB</Zugriffszeit></Geschwindigkeit>
<Festplatte>
|
|
Mein Vorschlag für die Fehler:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
<?xml version="1.0" encoding="UTF-8"?>
<Festplatte> <!--Wurzelelement-->
<Festplattenmodell> ST31000528AS </Festplattenmodell>
<Serie>Barracuda 7200.12</Serie>
<Bauform>3,5 Zoll</Bauform>
<Kapazitaet capacity="1000" einheit="GB">
<Schnittstellentyp> Serial ATA/300 </Schnittstellentyp>
<Datentransferratenwert> bis zu 125 MB/s (lesen) </Datentransferratenwert>
<Preis= “47,95" waehrung="EUR">
<Drehzahl>7200 U/min</Drehzahl>
<Zugriffszeit Lesen=“8.5 ms“ Schreiben=“9.5 ms“>
<Cache> 32 MB </Cache>
<Festplattenmodell="WD10EADS">
<Serie> Caviar Green</Serie>
<Kapazität capacity="1000" einheit="GB">
<Bauform>3,5 Zoll</Bauform>
<Schnittstellentyp> Serial ATA/300 </Schnittstellentyp
<Datentransferratenwert> bis zu 125 MB/s (lesen) </Datentransferratenwert>
<Drehzahl>7200 U/min </Drehzahl>
<Zugriffszeit> 8,9ms (lesen) <Zugriffszeit>
<Cache> 32 MB </Cache>
</Festplatte> |
|
|
|
31.12.2014 19:24 |
|
|
123michi19
Mitglied
![](images/star.gif) ![](images/star.gif)
Dabei seit: 22.12.2014
Beiträge: 45
![](images/spacer.gif) |
|
XSD möchte ich auch gleich noch hinterher"schießen --> passt zu Silvester :-)"
Mir ist klar, dass hier bestimmt einige Fehler vorhanden sind. Aber ohne Übung kann das ja nie klappen. Daher danke ich Euch für Eure Hilfe :-)
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
|
XML - Datei (Buch von Meier Hans mit dem Titel "Ein Sommertraum" als XML - Dokument)
<?xml version="1.0" encoding = "UTF-8"?>
<Buch>
<Autor Name = "Meier" Vorname = "Hans">
<Titel> Ein Sommertraum </Titel>
</Buch>
Zugehörige XSD - Datei
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3org/2001/XMLSchema"> <!-- Namensraum -->
<xs: element name = "Buch"> <!-- Oberbegriff -->
<xs:complexType name = "Name"> <!-- Namenszuweisung -->
<xs: sequence> <!-- öffnender sequence-Tag -->
<xs: element Name = "Meier" type = "xs:string"/> <!-- Element Name und Typ string -->
<xs:element Vorname = "Hans" type = "xs:string"/> <!-- Element Vorname und Typ string -->
</xs: sequence> !-- schließender sequence-Tag -->
</xs: complexType name> <!-- schließender Tag - Namenszuweisung -->
<xs: complexType name = "titel"> <!-- nächster Namen -->
<xs: sequence >
<xs:element Titel = " Ein Sommertraum " type = "xs:string">
</xs:sequence>
<xs: complexType>
|
|
|
|
31.12.2014 20:58 |
|
|
as_string
Haudegen
![](images/star2.gif) ![](images/star2.gif) ![](images/star2.gif)
Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg
![](images/spacer.gif) |
|
Hallo 123michi19!
Ich verstehe nicht, was Du mit "meinen Vorschlag für die Fehler" genau meinst. Du solltest doch einfach zuerst Fehler in der gegebenen Datei finden und nicht gleich alles anders schreiben.
Z. B. fehlt am Ende der Datei bei dem schließenden "Festplatte"-Tag offenbar ein "/", also statt sollte wohl dort stehen. Dann sind bei dem Wert des einzigen Attributs von "Festplatte" die doppelten Hochkomma offenbar vergessen worden. Dann heißt das Attribut beim ersten Festplatte-Tag Modellbezeichnung und beim zweiten Modell und so weiter...
Bei Deiner Datei würde ich auch einiges auszusetzen haben. Wenn Du mehrere Festplatten hast und ein einziges Wurzelelement haben möchtest (was durchaus sinnvoll ist), dann macht man normalerweise ein Tag mit dem Plural außenrum, also etwa:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
<Festplatten>
<Festplatte...>
...
</Festplatte>
<Festplatte...>
...
</Festplatte>
</Festplatten>
|
|
Dann hast Du bei Deinem "Preis"-Tag einen Fehler. Ein Tag muss immer zuerst den Tag-Namen haben (der dann kein Gleichheitszeichen und einen Wert zugewiesen haben darf, also <Preis=..."> ist auf jeden Fall falsch) und dann erst die Namen-Wert-Paare von den einzelnen Attributen.
Generell bin ich skeptisch mit den Einheiten. Mal schreibst Du Attribute mit einem Wert und noch eines mit einer Einheit, mal einen String "7200 U/min" der ja auch aus einer Zahl und einer Einheit besteht, aber jetzt nicht mehr semantisch interpretiert werden kann (ein Computer würde nicht so einfach verstehen, dass es Einheiten sind und könnte nicht automatisch umrechnen, z. B.).
Generell ist es meistens vernünftig, die Einheit als Attribut des Tags zu nehmen und den Wert dann eben als Tag-Wert. Ob es da aber "verbindliche" Regeln gibt, weiß ich genau so wenig wie mit der Frage, was macht man als Unter-Element und was als Attribut.
Bei Zugriffszeit fehlt der schließende Tag (oder eben das "/" am Ende des Tags als Abkürzung).
Was aber irgendwie ganz falsch bei Deinem Vorschlag ist: Es geht hier um zwei verschiedene Festplatten! Eine Barracuda vom Hersteller Seagate und einer vom Hersteller Western Digital. Du hast jetzt bei Dir im Tag "Festplatte" die ganzen Angaben doppelt. Da weiß man doch gar nicht mehr, zu welcher der beiden Festplatten ein einzelner Wert jetzt gehört! Du musst schon für jede der beiden Festplatten einen Tag haben mit den Eigenschaften dann als Attribute und Unterelemente. Das ist ja sogar in der ursprünglichen Datei besser: Da gibt es zwei Festplatten-Tags, der erste wird geschlossen, bevor der zweite aufgemacht wird und alle Angaben, die zur ersten Festplatte gehören sind auch in dem Tag für die erste Festplatte drin.
Schau Dir das noch einmal genauer an!
Gruß
Marco
|
|
01.01.2015 22:32 |
|
|
Erstsemester unregistriert
![](images/spacer.gif) |
|
Hallo,
habe diese Aufgabe mit XPath auch versucht und stelle fest, dass ich bei der Teilaufgabe c scheitere (a und b kein Problem)
Die Titel der Artikel von Susi Sonne
Habe jetzt folgendes versucht:
/Liste/Zeitschrift/Ausgabe/Artikel/Autor
Dann werden mir alle Autoren angezeigt. Jetzt müsste ich ja noch auf Susi Sonne eingrenzen und ihre Titel ausgeben.
Habe dann folgendes versucht um zumindest einmal die Titel aller Autoren zu bekommen, funktioniert aber laut Online XPath - Test nicht:
/Liste/Zeitschrift/Ausgabe/Artikel/Autor/Titel
Wo liegt denn mein Fehler?
Vielen Dank
|
|
22.01.2015 09:14 |
|
|
|