Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
XML Knoten auslesen
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

XML Knoten auslesen

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
lindan
myCSharp.de - Member

Avatar #avatar-2403.jpg


Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Thamsite am .
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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..
private Nachricht | Beiträge des Benutzers
Lothi
myCSharp.de - Member

Avatar #avatar-2631.jpg


Dabei seit:
Beiträge: 350
Herkunft: Schweiz

beantworten | zitieren | melden

Hallo Thamesite

Deine Fehlermeldung ist doch:
Zitat
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
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
lindan
myCSharp.de - Member

Avatar #avatar-2403.jpg


Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

Zitat von Thamsite
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
private Nachricht | Beiträge des Benutzers
Lothi
myCSharp.de - Member

Avatar #avatar-2631.jpg


Dabei seit:
Beiträge: 350
Herkunft: Schweiz

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Thamsite am .
private Nachricht | Beiträge des Benutzers
Lothi
myCSharp.de - Member

Avatar #avatar-2631.jpg


Dabei seit:
Beiträge: 350
Herkunft: Schweiz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Lothi
myCSharp.de - Member

Avatar #avatar-2631.jpg


Dabei seit:
Beiträge: 350
Herkunft: Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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ß
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Thamsite am .
private Nachricht | Beiträge des Benutzers
Lothi
myCSharp.de - Member

Avatar #avatar-2631.jpg


Dabei seit:
Beiträge: 350
Herkunft: Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Thamsite
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers