XDocument.Descendants ne retournant pas leurs descendants

<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 itérer à travers tous les noeuds sous nationalList mais ça ne marche pas pour moi, ça saute le foreach boucle entièrement. Ce que je fais mal?

29
demandé sur arserbin3 2012-08-13 15:52:38

4 réponses

vous n'incluez pas le namespace, 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"))
{
    ...
}
70
répondu Jon Skeet 2018-01-17 22:02:55

Vous devez utiliser le namespace:

XNameSpace ns = "http://www.lge.com/ddc";

foreach (XElement element in xdoc.Descendants(ns + "nationalList")
{
      MessageBox.Show(element.ToString());
}
6
répondu Henk Holterman 2012-08-13 12:01:41

si vous ne voulez pas avoir à utiliser le préfixe ns dans tous les sélecteurs, vous pouvez également supprimer le namespace upfront lors de l'analyse du xml. par exemple:

XNamespace ns = "http://www.lge.com/ddc";
XDocument xdoc = XDocument.Parse(xml.Replace(ns, string.Empty));

foreach (XElement element in xdoc.Descendants("nationalList")
...
2
répondu derekadk 2017-09-28 01:24:33

il est correct que vous devez inclure l'espace de noms, mais les exemples ci-dessus ne fonctionnent pas à moins que vous mettiez l'espace de noms dans des bracelets bouclés:

XNameSpace ns = "http://www.lge.com/ddc";

foreach (XElement element in xdoc.Descendants("{" + ns + "}nationalList")
{
      MessageBox.Show(element.ToString());
}

Salutations Christian

-3
répondu Christian Moser 2014-03-01 15:03:10