Frank (no reg): XML parsen

Beitrag lesen

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 if

Ausserdem 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