Mit C# XML verarbeiten, aber Whitespace innerhalb von Tags ignorieren



  • Hallo,

    vielen Dank für die Antwort. Das funktioniert schonmal super. Leider bin ich dadurch schon auf das nächste Problem gestoßen. Und zwar kriege ich es nicht hin, nur den Value des aktuellen Nodes abzurufen. Angenommen, ich habe in etwa so eine Struktur wie unten. Nun möchte ich den Value von einem Tag "BOOK" (welcher Tag ist zunächst egal) abrufen. Ich habe es mit einem Objekt vom Typ XmlNode sowie XmlElement versucht. Und von diesen beiden Objekten die Methoden bzw. Eigenschaften
    InnerText, InnerXml, LocalName, Name, Value, OuterXml.
    Das macht aber alles nicht das was ich will. Z.B. gibt mir InnerText den Value von BOOK sowie den Inhalt des Child Tags BUY zurück.
    Eigentlich suche ich eine Methode / Eigenschaft vergleichbar mit Value, die ja z.B. XmlAttributeCollection existiert und genau das macht was ich will, nur eben mit Attributen.

    Bin jetzt schon 2 Stunden in MSDN am Suchen aber irgendwie steh ich auf dem Schlauch.

    <BOOK> 
    ISBN 5415464684 
    <BUY>1</BUY> 
    </BOOK> 
    <BOOK> 
    ISBN 464654
    <BUY>0</BUY> 
    </BOOK> 
    <BOOK> 
    ISBN 464646846
    <BUY>1</BUY> 
    </BOOK>
    


  • XMLReader



  • Die "falschen" Ergebnisse von XmlNode/XmlElement könnten daran liegen, dass dein XML-Dokument nicht dem Standard entspricht (well-formed).

    Probier es mal so:

    <BOOK ISBN="5415464684">
      <BUY>1</BUY>
    </BOOK>
    <BOOK ISBN="464654">
      <BUY>0</BUY>
    </BOOK>
    <BOOK ISBN="464646846">
      <BUY>1</BUY>
    </BOOK>
    


  • Danke für die Antworten. XmlReader kommt für mich nicht in Frage, weil ich mit einem DOM (also zwischengespeichert) arbeiten möchte. Also abgesehen von dem Whitespace müsste das Dokument eigentlich schon well-formed sein. Nach meinem Kenntnisstand darf belieibig viel WhiteSpace zwischen einem start- und einem end-tag enthalten sein. Ist das falsch?

    Die ISBN möchte ich in diesem Fall nicht als Attribut nehmen, sondern tatsächlich als Inhalt zwischen zwei Tags.

    Ehrlich gesagt verstehe ich den Sinn von z.B. "InnerText" gar nicht. Was fange ich denn mit den verketteten Werten des Knotes inkl. sämtlicher untergeordneter Knoten an??? Da sehe ich keinen Sinn drin.

    Ich habe jetzt mit folgendem Stück Code das gewünschte Ergebnis erzielt:

    myNode.ChildNodes.Item(0).Value;
    

    Dabei ist "myNode" ein Objekt vom Typ XmlNode. Und mit der oberen Zeile kriege ich dann z.B. "ISBN 5415464684" zurück, um mal bei dem obigen Beispiel zu bleiben.

    Aber da muss es doch irgend etwas einfacheres geben, oder?

    Bin für weitere Vorschläge dankbar!



  • Gast349347 schrieb:

    müsste das Dokument eigentlich schon well-formed sein

    Wie mir gerade auch auffällt: nee ist es nicht.



  • @SeboStone: Warum nicht? Wegen dem Whitespace?

    Habe mir meine Codezeile nochmal angekuckt und verstehe eigentlich gar nicht warum das funktioniert.

    Der Ausdruck

    myNode.ChildNodes.Item(0)
    

    gibt ein Objekt vom Typ XmlNode zurück, und wenn darauf die Eigenschaft "Value" angewendet wird, dann sollte eigentlich "null" zurück kommen.

    Sehe ich das richtig?



  • Document.SelectSingleNode(".//BOOK[@ISBN='12345']");

    Funktioniert aber nur wenn Du ISBN auch als Attribute benutzt, wie o.O. bereits beschrieben hat.

    auch möglich um einfach nur durch alle iterieren:

    foreach(XmlNode node in Document.SelectNodes(".//BOOK"))
    {
    }



  • wenn du die ISBN nicht als Attribut nehmen willst, was spricht dagegen, sie als Element zu verpacken??

    <BOOK> 
    <ISBN>5415464684 </ISBN>
    <BUY>1</BUY> 
    </BOOK> 
    <BOOK> 
    <ISBN>464654</ISBN>
    <BUY>0</BUY> 
    </BOOK> 
    <BOOK> 
    <ISBN>464646846</ISBN>
    <BUY>1</BUY> 
    </BOOK>
    


  • Mhm naja es ist leider einfach so, dass ich keinen Einfluss darauf habe wie die xml-Datei aussieht.

    Seid ihr dann quasi der Meinung, dass von Microsoft keine Möglichkeit vorgesehen wurde, den Text eines Elements auszugeben, wenn noch weitere Elemente darin verschachtelt sind?



  • Du hast Doch innerhalb Deiner Book-Node eine Node vom Typ XmlText, gefolgt von einer Node vom Typ XmlElement ("BUY"). In der Node vom Typ XmlText steht der Text vor dem Buy-Element.

    Übrigens, was ist eigentlich wenn das Element so aussieht:

    <BOOK>
    ISBN <BUY>1</BUY> 541541541541
    </BOOK>
    

    Immernoch gültig?



  • Gast349347 schrieb:

    @SeboStone: Warum nicht? Wegen dem Whitespace?

    Nein. Schau' mal hier: http://de.wikipedia.org/wiki/Extensible_Markup_Language da wird sehr gut beschrieben wie eine XML Datei aussehen muss. Das Problem bei Deinem XML liegt in der zweiten Zeile.



  • SeboStone schrieb:

    Gast349347 schrieb:

    @SeboStone: Warum nicht? Wegen dem Whitespace?

    Nein. Schau' mal hier: http://de.wikipedia.org/wiki/Extensible_Markup_Language da wird sehr gut beschrieben wie eine XML Datei aussehen muss. Das Problem bei Deinem XML liegt in der zweiten Zeile.

    Erläuter mal. Willst Du darauf hinaus, dass man im Tag-Inhalt nicht CDAta mit weiteren Tags mischen darf? Das wäre nämlich falsch:

    http://www.w3.org/TR/REC-xml/#NT-content

    (Mit einer Mixed-Elementdefinition, z.B "(#PCDATA|BUY)*")

    Oder meinst Du, dass das Wurzelelement fehlt?



  • Nein, ich meine nicht das Wurzelelement, sondern:

    <tag1>
    	blabla
    	<tag2>
    		blubber
    	</tag2>
    </tag1>
    

    das müsste meiner Meinung nach entweder so:

    <tag1>
    	blabla
    </tag1>
    <tag2>
    	blubber
    </tag2>
    

    oder so:

    <tag1 attrib="blabla">
    	<tag2>
    		blubber
    	</tag2>
    </tag1>
    

    lauten. Wenn ich da falsch liege ist mir das neu. 😮



  • SeboStone schrieb:

    Wenn ich da falsch liege ist mir das neu. 😮

    Kennst Du XHTML? 😉

    <p>
        Dies ist <strong>korrektes</strong> <acronym>XHTML</acronym>!
    </p>
    

    /EDIT: Wichtiger Nachtrag in diesem Zusammenhang: XHTML ist well-formed.



  • Ja kenne ich. 🤡


Anmelden zum Antworten