Unzulässige XML-Zeichen im Pfad

71

Ich frage einen seifenbasierten Dienst ab und möchte das zurückgegebene XML analysieren, wenn ich jedoch versuche, das XML in ein XDoc zu laden, um die Daten abzufragen. Erhalte ich die Fehlermeldung "Unzulässige Zeichen im Pfad"? Dies (unten) ist das vom Dienst zurückgegebene XML. Ich möchte einfach die Liste der Wettbewerbe abrufen und sie in eine Liste einfügen, die ich eingerichtet habe. Das XML wird jedoch in ein XML-Dokument geladen und muss daher korrekt formatiert sein.

Jeder Rat, wie man dies am besten tun und den Fehler umgehen kann, wäre sehr dankbar.

<?xml version="1.0" ?> 
- <gsmrs version="2.0" sport="soccer" lang="en" last_generated="2010-08-27 20:40:05">
- <method method_id="3" name="get_competitions">
  <parameter name="area_id" value="1" /> 
  <parameter name="authorized" value="yes" /> 
  <parameter name="lang" value="en" /> 
  </method>
  <competition competition_id="11" name="2. Bundesliga" soccertype="default" teamtype="default" display_order="20" type="club" area_id="80" last_updated="2010-08-27 19:53:14" area_name="Germany" countrycode="DEU" /> 
  </gsmrs>

Hier ist mein Code, ich muss in der Lage sein, die Daten in einem XDoc abzufragen:

string theXml = myGSM.get_competitions("", "", 1, "en", "yes");
XmlDocument myDoc = new XmlDocument();
MyDoc.LoadXml(theXml);
XDocument xDoc = XDocument.Load(myDoc.InnerXml);
Kevin
quelle
Woher kommen diese -Charaktere? Handelt es sich um einen Kopier- / Einfügefehler oder handelt es sich um das eigentliche XML?
Oded
@Oded Ich denke, sie stammen aus dem Kopieren und Einfügen des XML aus dem IE der XML-Ansicht von VS.
Ondrej Tucny
Ja, ich habe aus dem XMLVisualier in Visual Studio kopiert
Kevin

Antworten:

227

Sie zeigen Ihren Quellcode nicht an, aber ich denke, was Sie tun, ist Folgendes:

string xml = ... retrieve ...;
XmlDocument doc = new XmlDocument();
doc.Load(xml); // error thrown here

Die LoadMethode erwartet einen Dateinamen, kein XML selbst. Verwenden Sie zum Laden eines tatsächlichen XML einfach die folgende LoadXmlMethode:

... same code ...
doc.LoadXml(xml);

In ähnlicher Weise erwartet die Verwendung XDocumentder Load(string)Methode einen Dateinamen , kein tatsächliches XML. Da es jedoch keine LoadXmlMethode gibt, lautet die korrekte Methode zum Laden des XML aus einer Zeichenfolge wie folgt:

string xml = ... retrieve ...;
XDocument doc;
using (StringReader s = new StringReader(xml))
{
    doc = XDocument.Load(s);
}

Tatsächlich ist es bei der Entwicklung von Dingen eine sehr gute Idee, auf die Semantik (Bedeutung) von Parametern zu achten, nicht nur auf deren Typen. Wenn der Typ eines Parameters a ist string, bedeutet dies nicht, dass man nur alles eingeben kann, was eine Zeichenfolge ist.

Auch in Bezug auf Ihre Frage aktualisiert, es macht keinen Sinn , zu verwenden XmlDocumentund XDocumentzugleich. Wähle den einen oder anderen.

Ondrej Tucny
quelle
2
Danke für die Antwort. Dies funktioniert, um es in ein XMLDocument zu laden, aber ich erhalte immer noch die unzulässigen Zeichen im Pfad, wenn ich versuche, dieses XML in ein XDoc zu laden, um die Daten abzufragen. Irgendwelche Ideen? Zeichenfolge theXml = myGSM.get_competitions ("", "", 1, "en", "yes"); XmlDocument myDoc = new XmlDocument (); myDoc.LoadXml (theXml); XDocument xDoc = XDocument.Load (myDoc.InnerXml);
Kevin
Es tut mir leid, dass ich Stackoverflow zum ersten Mal verwendet habe. Ich habe also Probleme beim Hinzufügen und Formatieren meiner Antworten, wie Sie sehen können !!!
Kevin
Vielen Dank für die umfassende Erklärung, sehr nützlich. Ich erhalte jetzt jedoch den folgenden Fehler, wenn ich Ihren Vorschlag wie oben gezeigt versuche, irgendwelche Ideen? Auf 'System.Xml.Linq.XDocument.Load (System.IO.TextReader)' kann nicht mit einer Instanzreferenz zugegriffen werden. qualifizieren Sie es mit einem Typnamen
Kevin
1
@ Kevin Eh, sorry, meine Schuld. Der richtige Code lautet doc = XDocument.Load(s)- siehe Update.
Ondrej Tucny
Wenn Sie verwenden XDocument, können Sie einfach tun, var doc = XDocument.Parse(xml)wo xml eine Zeichenfolge ist, die Ihr XML enthält.
Dan Diplo
9

Weiterverfolgung der Antwort von Ondrej Tucny:

Wenn Sie stattdessen eine XML-Zeichenfolge verwenden möchten, können Sie ein XElement verwenden und die Methode "parse" aufrufen. (Da XElement und XDocument für Ihre Anforderungen Ihren Anforderungen entsprechen würden)

Zum Beispiel ;

string theXML = '... get something xml-ish...';
XElement xEle = XElement.Parse(theXML);

// do something with your XElement

Mit der Parse-Methode von XElement können Sie eine XML-Zeichenfolge übergeben, während die Load-Methode einen Dateinamen benötigt.

Harvey Darvey
quelle
3

Warum nicht

XDocument.Parse(theXml);

Ich gehe davon aus, dass dies die richtige Lösung sein wird

Swaraj
quelle
2

Wenn dies wirklich Ihre Ausgabe ist, handelt es sich aufgrund der Minuszeichen ('-') um illegales XML. Ich vermute, dass Sie dies aus einem Browser wie IE ausgeschnitten und eingefügt haben. Sie müssen das genaue XML in einem Texteditor und nicht in einem Browser anzeigen.

peter.murray.rust
quelle
Ich habe aus dem XML Visualier in VS 2010 kopiert und eingefügt. Diese dienen nur dazu, die XML-Knoten zu erweitern, nicht wahr?
Kevin
@ Kevin Es ist fast unmöglich, Zeichen zu debuggen, nachdem sie eine Browseranzeige durchlaufen haben. Es ist möglich, dass ein illegaler Charakter in etwas anderes verwandelt wurde. Ich vermute, der wahre Grund liegt näher bei @Ondrej Tucny, aber es ist immer wichtig, das genaue XML zu kennen. Zum Beispiel wäre ein Leerzeichen am Anfang des Dokuments unzulässig, obwohl Sie wahrscheinlich eine andere Fehlermeldung erhalten würden
peter.murray.rust
Es sind viele XML-Validatoren online - schlagen Sie vor, zweifelhaftes XML in diese einzufügen und Fehlermeldungen zu erhalten. xmlvalidation.com war der erste in meinem Googeln
peter.murray.rust