Laden...

XML Knoten auslesen

Erstellt von Thamsite vor 15 Jahren Letzter Beitrag vor 15 Jahren 10.266 Views
T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren
XML Knoten auslesen

verwendetes Datenbanksystem: keines

Hallo,

ich habe ein Problem:

 try
          {

              MessageBox.Show(request);
              string response = myWebHandler.executeRPC(request);
              MessageBox.Show(response);

              XmlDocument myXMLDoc = new XmlDocument();
              myXMLDoc.LoadXml(response);


              XmlNode bkm = myXMLDoc.SelectSingleNode("//adBKMURL");
              BKMBox.Text = bkm.InnerText;


              XmlNodeList nodes = myXMLDoc.SelectNodes("//text"); 
              MessageBox.Show(bkm.InnerText);

              int i = 1;

              foreach (XmlNode myNode in nodes)
              {
                  ResultBox.AppendText(i++ + "." + myNode.InnerText);                
              }
          }
          catch (Exception ex) 
          { ResultBox.Text = ex.Message; } 

Ich möchte den InnerText des Knotenelements "text" und des "adBKMURL" haben, aber ich habe leider einen Fehler: Es wird nichts zurück geschrieben in das Windows Form?!

Die Zeile:

MessageBox.Show(response);

funktioniert und zeigt mir die Antwort des Webservices in der MessageBox an.

Es muss also irgendwo ein Fehler in meiner Auswertung liegen, den ich bisher nicht sehe!?

Danke für Eure Hilfe!

103 Beiträge seit 2006
vor 15 Jahren

Gibt dir Xpath denn überhaupt Knoten zurück?

Das wäre als erstes zu Prüfen.
Falls nicht, ist dein XPath -Statement falsch, bzw. der fragliche Namespace ist im Namespacemanager nicht angelegt.

OUT! OUT! You demons of stupidity!
-Dogbert

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hi,

gute Idee ich werde das prüfen.

Außerdem hab ich folgende News:

Es wird der Text "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." ins Textfield geschrieben??

BTW: Hast du einen Vorschlag wie ich das testen kann?

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hallo,

ich habe //adBKMURL und //text getestet in XML Spy. Dort bekomme ich den Inhalt der Knoten zurück, hätte mich auch gewundert, da ja // ne relative Adressierung einleitet.

Dennoch kriege ich das nicht zurück geschrieben.

Komisch..

344 Beiträge seit 2006
vor 15 Jahren

Hallo Thamesite

Deine Fehlermeldung ist doch:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Da gibt es hier im Forum eine FAQ:

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Vielleicht hilft das ja schon.

Gruss Lothi

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hi,

erstmal danke für den Link.

Aber ich habe dieses Problem kurioserweise nicht mehr.

Nochmal zurück zum ursprünglichen Code:

try
          {

              MessageBox.Show(request);
              string response = myWebHandler.executeRPC(request);
              MessageBox.Show(response);

              XmlDocument myXMLDoc = new XmlDocument();
              myXMLDoc.LoadXml(response);


              XmlNode bkm = myXMLDoc.SelectSingleNode("//adBKMURL");
              BKMBox.Text = bkm.InnerText;


              XmlNodeList nodes = myXMLDoc.SelectNodes("//text");
              MessageBox.Show(bkm.InnerText);

              int i = 1;

              foreach (XmlNode myNode in nodes)
              {
                  ResultBox.AppendText(i++ + "." + myNode.InnerText);
              }
          }
          catch (Exception ex)
          { ResultBox.Text = ex.Message; }  


Das sieht doch okay aus, in einem anderen Projekt hat das tadellos funktioniert?

Muss ich evtl. beim SelectNodes noch den Namensraum angeben? (= das habe ich vorher auch nie machen müssen da ich nur einen habe)

Gruß

103 Beiträge seit 2006
vor 15 Jahren

Hallo,

ich habe //adBKMURL und //text getestet in XML Spy. Dort bekomme ich den Inhalt der Knoten zurück, hätte mich auch gewundert, da ja // ne relative Adressierung einleitet.

Dennoch kriege ich das nicht zurück geschrieben.

Komisch..

Wenn du Namespaces hast brauchst du den Namespacemanager. Auch der Default-Namespace muss dann dort mit einem selbstgewählten Präfix hinterlegt sein.
Dein XPath kann im XmlSpy hundertmal matchen, das heißt nicht, das es auch im .NET funktioniert. Ein häufiges Problem, wenn man mit Xpath arbeitet.

OUT! OUT! You demons of stupidity!
-Dogbert

344 Beiträge seit 2006
vor 15 Jahren

Hallo

Und im

myXMLDoc.InnerText Ist da etwas drin?

Die ResultBox ist leer? Kannst das ganze doch mal Schritt für Schritt durchgehen.

Die Path's sind richtig?

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hallo,

erstmal vielen vielen Dank für die Hilfe!

myXMLDoc.InnerText: Ja hier ist was drin und zwar genau das was ich verarbeiten will!

Das ist jetzt der letzte Stand von der XML Abfrage in meinem Code:

  try{

              Corticon.CcServerMessagingAxisService myWebHandler = new Corticon.CcServerMessagingAxisService();

              MessageBox.Show(request);
              string response=myWebHandler.executeRPC(request);
              MessageBox.Show(response);

              XmlDocument myXMLDoc = new XmlDocument();
              myXMLDoc.LoadXml(response);
              XmlNodeList nodes = myXMLDoc.SelectNodes(".//text");

              MessageBox.Show(myXMLDoc.InnerText);

              int i = 1;

              foreach (XmlNode myNode in nodes)
              {
                  ResultBox.AppendText(i++ + "." + myNode.InnerText);
              }

              XmlNode bkmNode = myXMLDoc.SelectSingleNode(".//adBKMURL");
             
              BKMBox.Text = bkmNode.InnerText; //hier ist der fehler
            

          }
          catch (Exception ex) 
          { ResultBox.Text = ex.StackTrace; }   
                                                                                                                                                                                                                                                                                                                                                                 

Außerdem wichtig:
Die Exception lößt aus, bisher keine Ahnung wieso aber folgendes wird in die ResultBox zurückgeschrieben aufgrund der Exception:

bei Startform.Startfenster.button1_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\xxx\Desktop\Diplomarbeit\xxx\xxxTest 123\Start.cs:Zeile 104.

Zeile 104 ist:

BKMBox.Text = bkmNode.InnerText; //hier ist der fehler

Jetzt müssten wir eigentlich unmittelbar vor der Lösung stehen. =)

Es kann doch jetzt evtl. nur noch ein Namespace Problem sein? Oder was mit dem Form?

344 Beiträge seit 2006
vor 15 Jahren

Ja fast.

Du hast uns jetzt mitgeteilt wo der Fehler ist aber nicht was der Fehler ist.
Ich würde einfach mal behaupten das der XMPath hier


XmlNode bkmNode = myXMLDoc.SelectSingleNode(".//adBKMURL");

einfach leer ist, weil er nichts findet. Aber siehst du sofort wenn du mal an dieser stelle einen Breakpoint setzt und dir die Variablen mal anschaust.

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Godlike:

bkmNode null steht dort! Richtig!! 👍

Übrigens: BKMBox.Text = myXMLDoc.InnerText funktioniert, er klatscht alles dran aber ich will ja nicht alles auf einmal.

Demnach stimmt was mit dem XPath nicht mhm.. das erklärt auch die Null-Referenz und die Exception die dann auslößt.

Also ich habe ein kleines XML Dokument was zurück fliegt. Wichtig ist für mich der Knoten "text" und "adBKMURL" die beiden Knoten brauche ich.

Ansonsten ist die Struktur:

CorticonResponse
WorkDocuments
OEM
->adBKMURL

bzw.
CorticonResponse
Messages
Message
text

Kurios nur das XML Spy mit //text gar kein Problem hat, muss ich den Namespace xmlns="urn:Corticon" xmlns:xsi="...schemainstance" beachten?

Was schlägst du vor?

344 Beiträge seit 2006
vor 15 Jahren

Genau jetzt musst du dich mit dem Beitrag von lindan (etwas weiter oben) auseinnander setzten.

Ich habe da schon mal was vorbereitet:

XmlNamespaceManager

Gruss Lothi

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hallo,

so ich hab den Beitrag durchgelesen und hab möglichst viel versucht umzusetzen, dennoch bleibe ich hier hängen:

Bitte gucke dir nochmal meinen Code an und vielen Dank für die Hilfe bis hier her:

try{

              Corticon.CcServerMessagingAxisService myWebHandler = new Corticon.CcServerMessagingAxisService();

              MessageBox.Show(request);
              string response=myWebHandler.executeRPC(request);
              XmlDocument myXMLDoc = new XmlDocument();


              XPathDocument doc = new XPathDocument(response);            
              XPathNavigator nav = doc.CreateNavigator();
              XmlNamespaceManager ns = new XmlNamespaceManager(nav.NameTable);
              ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
              ns.AddNamespace("urn", "Corticon");
              XPathExpression expr = nav.Compile("//text");
              expr.SetContext(ns);
              XPathNodeIterator nodeiterator = nav.Select(expr);            
              
              // Was kommt jetzt hier hin? Damit ich den //text Knoten auslesen kann?
              // muss ich die xsi Schema Instanz auch noch adden?
              
           
              
           
              XmlNodeList nodes = myXMLDoc.SelectNodes("//text");
               // /CorticonResponse/Messages/Message/text
                           

              int i = 1;

              foreach (XmlNode myNode in nodes)
              {
                  ResultBox.AppendText(i++ + "." + myNode.InnerText);
              }

              /*Zweiter Knoten adBKMURL auslesen:*/
             
              XmlNode bkmNode = myXMLDoc.SelectSingleNode("//adBKMURL");
              // /CorticonResponse/WorkDocuments/OEM/adBKMURL
             
              BKMBox.Text = bkmNode.InnerText; //hier ist der fehler
              // BKMBox.Text = myXMLDoc.InnerText;
            

          }
          catch (Exception ex) 
          { ResultBox.Text = ex.StackTrace; }  

Arbeite ich jetzt nur noch auf den Iterator oder wie läuft das mit dem myXMLDoc.Select.. jetzt nicht mehr?

Gruß

344 Beiträge seit 2006
vor 15 Jahren

Guten Abend

So wie ich das jetzt verstanden habe (habe das selber auch nie gemacht) kannst du das ganze auch über XmlDocument und SingleNode machen.


XmlDocument myXMLDoc = new XmlDocument();
myXMLDoc.LoadXml(response);
XmlNamespaceManager nsMan= new XmlNamespaceManager(myXMLDoc.NameTable);
nsMan.AddNamespace("xsi", xmlNamespace);
nsMan.AddNamespace("urn", xmlNamespace);

XmlNode test = myXMLDoc.DocumentElement.SelectSingleNode("/xsi:xyz",nsMan

So in der Art habe ich es jetzt aus der Hilfe verstanden. Der Rest wird wohl ausprobieren sein.

Gruss Lothi

T
Thamsite Themenstarter:in
77 Beiträge seit 2008
vor 15 Jahren

Hallo Lothi,

ich habs jetzt hinbekommen, also schon um 16:45 Uhr konnte mich jetzt aber erst melden.

Vielen Dank!! Ich dachte schon ich würd's nie hinbekommen. 🙂