40
<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完全跳过了循环。我在这里做错了什么?

4

4 回答 4

97

您不包括命名空间,即"http://www.lge.com/ddc"默认来自父元素的命名空间:

XNamespace ns = "http://www.lge.com/ddc";
foreach (XElement element in xdoc.Descendants(ns + "nationalList"))
{
    ...
}
于 2012-08-13T11:53:49.517 回答
10

您必须使用命名空间:

// 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());
}
于 2012-08-13T11:54:32.920 回答
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")
...
于 2017-09-28T01:24:33.397 回答
-3

必须包含命名空间是正确的,但除非将命名空间放在花括号中,否则上面的示例不起作用:

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

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

问候基督徒

于 2014-03-01T15:03:10.223 回答