Lesen Sie ein XML (aus einer Zeichenfolge) und erhalten Sie einige Felder - Probleme beim Lesen von XML

81

Ich habe dieses XML (gespeichert in einer C # -String namens myXML)

<?xml version="1.0" encoding="utf-16"?>
<myDataz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <listS>
    <sog>
      <field1>123</field1>
      <field2>a</field2>
      <field3>b</field3>
    </sog>
    <sog>
      <field1>456</field1>
      <field2>c</field2>
      <field3>d</field3>
    </sog>
  </listS>
</myDataz>

und ich möchte alle <sog>Elemente durchsuchen . Für jeden von ihnen möchte ich das Kind drucken <field1>.

Das ist also mein Code:

XmlDocument xmlDoc = new XmlDocument();
string myXML = "<?xml version=\"1.0\" encoding=\"utf-16\"?><myDataz xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><listS><sog><field1>123</field1><field2>a</field2><field3>b</field3></sog><sog><field1>456</field1><field2>c</field2><field3>d</field3></sog></listS></myDataz>"
xmlDoc.Load(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

aber anscheinend kann ich einen String nicht als XML lesen? Ich bekommeSystem.ArgumentException

markzzz
quelle
2
Was sagt die Ausnahme ?
SLaks
Können Sie XDocument in .NET 4.0 verwenden?
JohnD
Ich bin auf .NET 3.5! Ich habe die Ausnahme geschrieben!
Markzzz
1
Was ist die Ausnahme Nachricht ?
SLaks
XLINQ wird von .Net 3.5 vollständig unterstützt und ist viel einfacher zu bedienen.
SLaks

Antworten:

105

Sie sollten die LoadXml-Methode verwenden, nicht Load:

xmlDoc.LoadXml(myXML); 

Die Lademethode versucht, XML aus einer Datei und LoadXml aus einer Zeichenfolge zu laden. Sie können auch XPath verwenden:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

string xpath = "myDataz/listS/sog";
var nodes = xmlDoc.SelectNodes(xpath);

foreach (XmlNode childrenNode in nodes)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
} 
Andrey Marchuk
quelle
Super einfach. Endlich kann ich mit APIs arbeiten :).
C4d
7
Stattdessen SelectSingleNode("//field1").Valuesollte SelectSingleNode("//field1").InnerTextoder sein SelectSingleNode("//field1").InnerXml, da Value null wäre, da es sich nicht um ein Attribut handelt, sondern der Wert zwischen den Tags liegt.
Mathias Conradt
3
Um @MathiasConradt hinzuzufügen, sollte es sein, SelectSingleNode("field1").InnerTextwenn Sie nicht immer field1das erste Auftreten von myDataz / listS / sog lesen möchten.
Matthieu M.
19

Verwenden Sie Linq-XML,

XDocument doc = XDocument.Load(file);

var result = from ele in doc.Descendants("sog")
              select new
              {
                 field1 = (string)ele.Element("field1")
              };
 foreach (var t in result)
  {
      HttpContext.Current.Response.Write(t.field1);
  }

ODER: Ruft die Knotenliste des <sog>Tags ab.

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(myXML);
 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("sog");
 foreach (XmlNode childrenNode in parentNode)
  {
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("field1").InnerText);
   }
Adatapost
quelle
11

Die anderen Antworten sind mehrere Jahre alt (und funktionieren nicht für Windows Phone 8.1), daher dachte ich, ich würde eine andere Option wählen. Ich habe dies verwendet, um eine RSS-Antwort für eine Windows Phone-App zu analysieren:

XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(xml_string);
Sraboy
quelle
3

Oder verwenden Sie die XmlSerializer-Klasse.

XmlSerializer xs = new XmlSerializer(objectType);
obj = xs.Deserialize(new StringReader(yourXmlString));
Teebot
quelle
2

Ich habe das System.Xml.Linq.XElement für diesen Zweck verwendet. Überprüfen Sie einfach den folgenden Code, um den Wert des ersten untergeordneten Knotens der XML-Datei (nicht des Stammknotens) zu lesen.

        string textXml = "<xmlroot><firstchild>value of first child</firstchild>........</xmlroot>";
        XElement xmlroot = XElement.Parse(textXml);
        string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;
MGR
quelle