Onkellepie: XML File auslesen mit Namespace ohne Präfix

Hi,
hab folgendes Problem und vielleicht kann mir jemand von euch dabei helfen. Bin ein Newbie in Xml und probiere so rum und bin da auf ein Problem gestoßen.
Ich Arbeite mit VisualStudio.Net und C# und versuche jetzt eine XML File auszulesen.

Also ich bekomme eine XML File als string und lade sie Mittels

xmlDoc.Load(strXMLFile);

Das klappt soweit ganz gut, dann schreibe ich den string zur Kontrolle in eine Datei mittels:

writer.write(xmlDoc.DocumentElement.OuterXml);

Da bietet sich mir dann folgendes Bild:

  • <Buch xmlns="http://www.vielSpass.com/nochMehr">
      <DateTime>2006-04-10T01:53:41.561Z</DateTime>
  • <Titel>
      <TitelID>TitelIDTest</TitelID>
      </Titel>
  • <Autor>
      <AutorID>AutorIDTEST</AutorID>
      <GeburtsTag>GeburtsTagTest</GeburtsTag>
      <TodesTag>TodesTagTest</TodesTag>
      <Werke>WerkeTest</Werke>
      </Autor>
  • <Verlag>
      <VerlagsID>VerlagsIDTest</VerlagsID>
      <VerlagsName>VerlagsNameTest</VerlagsNameTest>
      </Verlag>
      </Buch>

Das ist auch alles Okay, aber jetzt die Frage:

Wie komme ich jetzt an die AutorID ran?

Ich habs probiert mit:

xmlDoc.DocumentElement.SelectSingelNode("Autor/AutorID").InnerText;

da krieg ich aber ne Null Exception!

Dann hab ich versucht mit NamespaceManager das auszuprobieren hat auch nicht geklappt.
Dann hab ich es so gemacht:

xmlDoc.DocumentElement.FirstChild.NextSibling.FirstChild.InnerText;

Da Funktionierts! Aber Das finde ich ist sehr unreiner Stil!
Darum wieder nen Schritt zurück!
Hab also den Namespace wieder drin und hab weiter probiert mit Sämtlichen vordefinierten Methoden! Nichts hat geholfen.
Dann hab ich den Namespace einfach aus dem String entfernt und da Funktioniert es.
Aber warum?, warum verändert der Namespace die XML File so das man nicht mehr vernünftig Durchnavigieren kann!

Bzw Wie kann ich trotz namespace, also xmlns ohne Präfix, vernünftig die Daten in der XML File auslesen???

Ich hoffe jemand hat ne Idee wie man das Problem lösen könnte!

Danke schonmal für die Hilfe

  1. Hi,
    hab folgendes Problem und vielleicht kann mir jemand von euch dabei helfen. Bin ein Newbie in Xml und probiere so rum und bin da auf ein Problem gestoßen.
    Ich Arbeite mit VisualStudio.Net und C# und versuche jetzt eine XML File auszulesen.

    Hi,

    also, wenn ich das mal sauber einrücke:

    <Buch xmlns="http://www.vielSpass.com/nochMehr">
      <DateTime>2006-04-10T01:53:41.561Z</DateTime>
      <Titel>
         <TitelID>TitelIDTest</TitelID>
      </Titel>
      <Autor>
         <AutorID>AutorIDTEST</AutorID>
         <GeburtsTag>GeburtsTagTest</GeburtsTag>
         <TodesTag>TodesTagTest</TodesTag>
         <Werke>WerkeTest</Werke>
      </Autor>
      <Verlag>
         <VerlagsID>VerlagsIDTest</VerlagsID>
         <VerlagsName>VerlagsNameTest</VerlagsNameTest>
       </Verlag>
    </Buch>
    Erstmal ist da ein Elementfehler drin, Verlagsname wird nicht geschlossen...

    xmlDoc.DocumentElement.SelectSingelNode("Autor/AutorID").InnerText;

    Ich glaub dieser Ausdruck startet in der falschen Ebene, oder täusche ich mich?
    entweder
    //Autor/AutorID
    oder
    /Buch/Autor/AutorID

    Namespaces hast du da ja eigentlich gar keine drin (na ja, Defaultnamespace mal ausgenommen)

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Genau da liegt mein Problem nur beim DefaultNamespace!

      Ansonsten funktioniert alles! Hab ja schonmal alles so gemacht wie oben beschrieben nur ohne das xmlns="...", da hat allesn spitze geklappt. Dann krieg ich aber einen string in dem das xmlns="..." mit drin steht! Und ab da findet er keines meiner Objekte mehr:

      System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

      !!!

      Durch das DocumentElement bin ich bereits in der root und kann daher durch
      Autor/AutorID

      locker durchnavigieren! Zumindest ohne Defaultnamespace.

      Also vielleicht kannst du mir/ihr  mir jetzt weiterhelfen.

      1. Du kannst doch auf die Property ".NamespaceURI" vom DocumentElement prüfen, wenn dies string.Empty ist, hat das DocumentElement keinen Default Namespace.

        Aber was genau tust du, dass du mal <Buch> mit Namespace und mal ohne bekommst?

        Übrigens ein Element in einem XPath Statement ohne Prefix gehört zu _keinem_ Namespace, egal ob das Dokument einen Namespace für das Objekt beschreibt. (betreffend XPath unter .Net)

        Genau da liegt mein Problem nur beim DefaultNamespace!
        Also vielleicht kannst du mir/ihr  mir jetzt weiterhelfen.

        Welches Problem liegt jetzt da? In meinem Code Schnipsel siehst du doch, dass man ein Prefix für die XPath Abfrage definiert.
        Bei was soll dich noch geholfen werden?

        Ciao, Frank

        1. Danke Frank, deine Antwort von vorhin hatte ich noch nicht gelesen da hatte ich Ruven schon geantwortet.
          Deine Antwort stellt mich erstmal zufrieden muss das jetzt erstmal ausprobieren.
          Das Problem ist ich bekomme den String von einer Anderen Anwendung und kann diesen nicht verändern. Denn bekomme ich so wie er ist.
          Und da war schon immer das xmlns drin hab es aber erstmal Manuell entfernt um es überhaupt zum laufen zu bringen.

          1. Herzlichen Dank Frank, so hats gepasst!

            Super, nochmal Danke!

      2. Hallo Zusammen,

        ich denke mal es funktioniert so wie Frank beschrieben hat.
        Ob es jetzt genauso ("a:Autor/a:AutorID", mgr); oder ("a:Autor/AutorID", mgr); musst Du selber mal testen.

        Rouven's antwort kannst Du denke ich mal überlesen. Er wollte wohl nur Dein BEISPIEL korrigieren, was Dir hier aber nicht hilft.

        Onkellepie teste das jetzt erst mal so wie er beschrieben hat.

    2. Hallo,

      xmlDoc.DocumentElement.SelectSingelNode("Autor/AutorID").InnerText;
      Ich glaub dieser Ausdruck startet in der falschen Ebene, oder täusche ich mich?
      entweder
      //Autor/AutorID
      oder
      /Buch/Autor/AutorID

      DocumentElement = <Buch>
      'Autor/AutorID' sucht ab unterhalb <Buch> nach Kindknoten <Autor>
      ist identisch mit './Autor/AutorID'

      Das vorhandensein einer Namespace-Deklaration ist für die .Net XPath-Implementierung erheblich.

      Ciao, Frank

  2. Hallo,

    dein XML Fragment enthält übrigens einen Fehler: <VerlagsName></VerlagsNameTest>, damit kann es nicht als XmlDocument geladen werden.

      
    XmlDocument dom = new XmlDocument();  
    dom.Load(System.IO.File.OpenRead(theFile));  
    // du musst für XPath Abfragen jedoch ein Präfix deklarieren, auch wenn es gar nicht im eigentlichen Dokument vorkommt, der XPath Prozessor will es so  
    XmlNamespaceManager mgr = new XmlNamespaceManager(dom.NameTable);  
    mgr.AddNamespace("a", "http://www.vielSpass.com/nochMehr");  
    // da du ein ein Präfix deklariert hast musst du es auch für jedes Element in der XPath Abfrage angeben, wie im folgenden  
    XmlNode n = dom.DocumentElement.SelectSingleNode("a:Autor/a:AutorID", mgr);  
    if(n == null)  
    {  
     Console.WriteLine("Not Found");  
    }  
    else  
    {  
     Console.WriteLine("Found");  
    }  
    
    

    Darüber hinaus empfehlen sich immer Prüfungen auf NULL-Referenzen.

    Hoffe, es hilft (das ganze ist vielleicht auf den ersten Blick nicht ganz straight-forward)

    Ciao, Frank