<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SetNationalList xmlns="http://www.lge.com/ddc">
<nationalList>
<portnumber>6000</portnumber>
<slaveaddress>7000</slaveaddress>
<flagzone>2</flagzone>
<flagindivisual>5</flagindivisual>
<flagdimming>3</flagdimming>
<flagpattern>6</flagpattern>
<flaggroup>9</flaggroup>
</nationalList>
</SetNationalList>
</s:Body>
</s:Envelope>
XDocument xdoc = XDocument.Parse(xml);
foreach (XElement element in xdoc.Descendants("nationalList"))
{
MessageBox.Show(element.ToString());
}
Je voudrais parcourir tous les nœuds sous nationalList
mais cela ne fonctionne pas pour moi, il ignore complètement la boucle foreach
. Qu'est-ce que je fais mal ici?
Vous n'incluez pas l'espace de noms, qui est "http://www.lge.com/ddc"
, par défaut à partir de l'élément parent:
XNamespace ns = "http://www.lge.com/ddc";
foreach (XElement element in xdoc.Descendants(ns + "nationalList"))
{
...
}
Vous devez utiliser l'espace de noms:
// do _not_ use var ns = ... here.
XNameSpace ns = "http://www.lge.com/ddc";
foreach (XElement element in xdoc.Descendants(ns + "nationalList")
{
MessageBox.Show(element.ToString());
}
Si vous ne souhaitez pas avoir à utiliser le préfixe ns dans tous les sélecteurs, vous pouvez également supprimer l'espace de noms dès le début lors de l'analyse du XML. par exemple:
string ns = "http://www.lge.com/ddc";
XDocument xdoc = XDocument.Parse(xml.Replace(ns, string.Empty));
foreach (XElement element in xdoc.Descendants("nationalList")
...