Подтвердить что ты не робот

XDocument.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());
}

Я хотел бы перебирать все узлы в nationalList, но он не работает для меня, он полностью пропускает цикл foreach. Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Вы не включили пространство имен, которое по умолчанию является "http://www.lge.com/ddc" из родительского элемента:

XNamespace ns = "http://www.lge.com/ddc";
foreach (XElement element in xdoc.Descendants(ns + "nationalList"))
{
    ...
}

Ответ 2

Вы должны использовать пространство имен:

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

Ответ 3

Если вы не хотите использовать префикс ns во всех селекторах, вы также можете удалить пространство имен заранее при разборе xml. например:

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

foreach (XElement element in xdoc.Descendants("nationalList")
...

Ответ 4

Правильно, что вы должны включить пространство имен, но приведенные выше примеры не работают, если вы не помещаете пространство имен в фигурные скобки:

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

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

Привет Christian