XDocument.Descendants没有返回后代

l46*_*kok 36 .net c# xml linq-to-xml

<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>
Run Code Online (Sandbox Code Playgroud)

XDocument xdoc = XDocument.Parse(xml);
foreach (XElement element in xdoc.Descendants("nationalList"))
{
   MessageBox.Show(element.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我想遍历每个节点,nationalList但它不适合我,它foreach完全跳过循环.我在这做错了什么?

Jon*_*eet 85

您没有包含名称空间"http://www.lge.com/ddc",默认情况下是父元素:

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

  • TIL:那个xml命名空间会受到伤害,并且`Descendants` /`Element` /`Elements`需要预先添加NS.*叹*.我欢迎我的json领主.... (8认同)
  • 这会引发异常,说":"在名称中无效.当我用"{http:// ....}"包围命名空间时工作 (2认同)
  • 是的,我知道我的与众不同之处;我将名称空间作为字符串而不是“ XNamespace” ..道歉插入 (2认同)

Hen*_*man 9

您必须使用命名空间:

// 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());
}
Run Code Online (Sandbox Code Playgroud)