89 votes

Lire un XML (à partir d'une chaîne) et obtenir certains champs - Problèmes de lecture XML

J'ai ce XML (stocké dans une chaîne C# appelée myXML)

      123
      a
      b

      456
      c
      d

et je voudrais parcourir tous les éléments . Pour chacun d'eux, je voudrais afficher l'enfant .

Donc voici mon code :

XmlDocument xmlDoc = new XmlDocument();
string myXML = "123ab456cd"
xmlDoc.LoadXml(myXML);
XmlNodeList parentNode = xmlDoc.GetElementsByTagName("listS");
foreach (XmlNode childrenNode in parentNode)
{
    HttpContext.Current.Response.Write(childrenNode.SelectSingleNode("//field1").Value);
}

mais il semble que je ne peux pas lire une chaîne en tant que XML? J'obtiens System.ArgumentException

2 votes

Que dit l'exception?

0 votes

Pouvez-vous utiliser XDocument dans .NET 4.0?

0 votes

Je suis sur .NET 3.5! J'ai écrit l'exception!

117voto

user978511 Points 6886

Vous devriez utiliser la méthode LoadXml, pas Load :

xmlDoc.LoadXml(myXML); 

La méthode Load essaie de charger du XML à partir d'un fichier et LoadXml à partir d'une chaîne. Vous pouvez également utiliser XPath :

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);
}

0 votes

Incroyable facile. Enfin je peux commencer à travailler avec les API :).

9 votes

Au lieu de SelectSingleNode("//field1").Value, il devrait être SelectSingleNode("//field1").InnerText ou SelectSingleNode("//field1").InnerXml, car Value serait nul, car ce n'est pas un attribut, mais la valeur se trouve entre les balises.

3 votes

Ajouter à @MathiasConradt, il devrait être SelectSingleNode("field1").InnerText si vous ne voulez pas toujours lire le field1 de la première occurrence de myDataz/listS/sog.

21voto

AVD Points 57984

Utilisez 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);
  }

OU : Obtenez la liste des nœuds de balise .

 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);
   }

14voto

sraboy Points 703

Les autres réponses datent de plusieurs années (et ne fonctionnent pas pour Windows Phone 8.1) donc j'ai pensé ajouter une autre option. J'ai utilisé ceci pour analyser une réponse RSS pour une application Windows Phone :

XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(xml_string);

3voto

teebot Points 530

Ou utilisez la classe XmlSerializer.

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

2voto

MGR Points 60

J'ai utilisé System.Xml.Linq.XElement dans ce but. Il suffit de vérifier le code ci-dessous pour lire la valeur du premier nœud enfant du xml (pas le nœud racine).

        string textXml = "valeur du premier enfant........";
        XElement xmlroot = XElement.Parse(textXml);
        string firstNodeContent = ((System.Xml.Linq.XElement)(xmlroot.FirstNode)).Value;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X