为什么C#XDocument.Descendants()不起作用?

时间:2014-10-01 13:36:42

标签: c# asp.net xml

我的XML示例:

<data>
    <Balance>
      <LocationName>Locatie 1</LocationName>
      <Latitude>39.74</Latitude>
      <Longitude>-104.99</Longitude> 
         <RTI>
            <Container>12</Container>
            <Pallet>54</Pallet>
        </RTI>
    </Balance>
    // Lots more Balance nodes
</data>

我的代码:

XDocument doc = XDocument.Load(HttpContext.Current.Request.PhysicalApplicationPath + "/Content/saldotracking.xml");
        var balances = doc.Descendants("Data");

        foreach (var b in balances)
        {
            if (b.Element("LocationName").Value == id)
            {
                this.LocationName = b.Element("LocationName").Value;
                this.Longitude = Convert.ToDouble(b.Element("Longitude").Value);
                this.Latitude = Convert.ToDouble(b.Element("Latitude").Value);
                this.pallets = Convert.ToInt16(b.Element("RTI").Element("Pallet").Value);
                this.containers = Convert.ToInt16(b.Element("RTI").Element("Container").Value);
            }
        }

根据调试器,值“b”包含整个XML文档,而不是单个Balance节点。我究竟做错了什么?我正在尝试读取BalanceName节点的所有后代,其LocationName节点的值等于String参数。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

根据您的变量名称和用法判断,您没有正确使用Descendants(string XName)

public IEnumerable<XElement> Descendants(
    XName name
)
     

按文档顺序返回此文档或元素的后代元素的筛选集合。 只有具有匹配 XName 的元素才会包含在集合中。

doc.Descendants("Data")将为您提供Data元素名称的所有后代,而不是 Data元素的所有后代

我怀疑你想要:

    var balances = doc.Descendants("Balance");

表示“给我所有元素名称为"Balance"

的文档元素的后代

答案 1 :(得分:2)

如果您想要读取Balance节点的后代,请使用以下语句

var balances = doc.Descendants(&#34; Balance&#34;);

它将使用&#34;余额&#34;

加载所有元素