Hallo,
um XML Dokumente zu parsen benutzt man für gewöhnlich eine entsprechende Komponente, für MS/ASP/VB wäre es beispielsweise der MSXML Parser in der jeweilig zur Verfügung stehenden Version. Der hat dann Klassen, die DOM implementieren und in deren Instanzen man XML Markup laden kann.
Ich habe eine XML-Datei die wie folgt aufgebaut ist
<buecher>
<buch>
<autor>AAA</autor>
<titel>BBB</titel>
</buch>
<buch>
.....
</buecher>
Ich komme einfach nicht dahinter wie ich auf die Elemte zugreifen kann. In PHP ist das so easy.
Dafür gibt es die .ChildNodes Collection von XmlNode sowie die Methoden Select/SelectSingleNode von XmlNode
Habe es bis jetzt soweit, aber da kommt zwar alles raus, was ich brauche, aber alles vollkommen unstrukturiert. Ich weiss also nicht, wann ein <buch> abgearbeitet ist und wann das naechste anfaengt.
Was ist unstrukturiert? Das du eine Schleife benutzt um jedes XmlNode Object in der XmlNode.ChildNodes Collection verarbeiten zu können. <buch> ist in dem Fall ein XmlNode aus XmlDoc.DocumentElement.ChildNodes. Das DocumentElement hat den Namen "buecher". Mit jeder Schleifeniteration arbeitest du also genau ein <buch> ab. Was ist daran so schwer?
Set rootNode = XMLDoc.documentElement
If rootNode.hasChildNodes() Then
For Each buch in rootNode.childNodes
response.write rootNode.nodeName & ": " & buch.Text & "<p>"
next
end ifAusserdem kann ich mit rootNode.nodeName nicht auf den Namen des Tags wie "autor" und "titel" zugreifen.
rootNode.NodeName zeigt auch auf das DocumentElement, <buecher>. Und nicht auf eines der Objekte "buch" aus der DocumentElement.ChildNodes Collection. "buch" selbst beinhaltet übrigens gar keinen eigenen .Text
Wo liegt mein Verstaendnisproblem? Ich dachte die Parser sind soweit, dass mir eine Information geliefert wird, wann ein Element <buch> abgearbeitet ist.
Die Parser selbst wohl schon, nur muss ihnen auch gesagt werden, was sie tun sollen. Wenn du den InnerText Wert <autor> haben willst, dann solltest du auch auf diesen Node zugreifen. z.b. mit
Set rootNode = XMLDoc.documentElement
If rootNode.hasChildNodes() Then
For Each buch in rootNode.childNodes
autorNode = buch.SelectSingleNode("autor")
response.write autorNode.nodeName & ": " & autorNode.Text & "<p>"
Next
End If
Hilft dir das jetzt etwas weiter?
Cheers,
Frank