2014-10-01 41 views
0

我的XML的一個例子:爲什麼C#XDocument.Descendants()不起作用?

<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文檔,而不是一個單一的平衡節點。我究竟做錯了什麼?我試圖讀取BalanceName節點的所有後裔,其中LocationName節點的值等於一個String參數。有人可以幫忙嗎?

+1

元素名稱的文檔元素的所有後代您的文檔沒有任何'在它Data'元素。它有一個'data'元素,但這不是一樣的...即使你要求數據,它沒有'LocationName'元素......它有一個'Balance'元素。也許你想'var balances = doc.Descendants(「Balance」)'? – 2014-10-01 13:38:39

回答

4

你的變量名和使用情況來看所有的元素,你是不是使用Descendants(string XName)正常。

public IEnumerable<XElement> Descendants(
    XName name 
) 

返回此文檔或元素的子代元素的濾波集合,按文檔順序。 集合中僅包含具有匹配的元素XName

doc.Descendants("Data")會給你所有後代與元素名稱Data,並不是所有後代Data元素

我懷疑你想:

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

,意思是「給我有"Balance"

2

,如果你想讀一個平衡節點的後代,然後輸入如下語句

VAR餘額= doc.Descendants(「平衡」);

將加載與「平衡」

+0

謝謝,我誤解了這個函數的文檔。我以爲你必須輸入節點的名稱,你想要所有的後代。相反,你必須輸入你想要的所有後代的名字。 – ohyeah 2014-10-01 13:45:04

+0

也使用XElement,與XDocument相比,它要快得多。 示例代碼: 的XElement DOC = XElement.Load(HttpContext.Current.Request.PhysicalApplicationPath + 「/Content/saldotracking.xml」); var balances = doc.Descendants(「Balance」); – 2014-10-01 14:03:21