2011-11-29 114 views
1

我有一個XML結構:查詢不獲取所有記錄

<pit> 
    <ROW TestID="47855" ExecutionID="1510034507" TestName="USHP" AssertionName="Check News" Status="1" TestLatencyMs="5448" Date="2011-11-29 01:43:45.117" HttpCode="" Error="" TestOwner="mdk" AssertionID="119117" /> 
    <ROW TestID="47855" ExecutionID="1510028579" TestName="USHP" AssertionName="Check News" Status="0" TestLatencyMs="7312" Date="2011-11-29 01:41:46.273" HttpCode="" Error="" TestOwner="fdxk" AssertionID="119117" /> 
    <ROW TestID="47855" ExecutionID="1510022153" TestName="USHP" AssertionName="Check News" Status="0" TestLatencyMs="5860" Date="2011-11-29 01:39:44.153" HttpCode="" Error="" TestOwner="klo" AssertionID="119117" /> 
    </pit> 

,我嘗試使用此查詢來獲取我的ExecutionIDs但無濟於事:(我不知道什麼是錯

List<int> executionIdList = new List<int>(); 
    try 
    { 
     executionIdList = (from result in xDoc.Root.Descendants("ROW") 
          where result != null && 
          result.Attribute("Status").Value.Equals("0", StringComparison.CurrentCultureIgnoreCase) 

          select result.Attributes("ExecutionID")).FirstOrDefault().Select(x => int.Parse(x.Value)).ToList(); 
    } 

我只得到與上述查詢的第一個值。

回答

1

可以從的XDocument如下所示取YOUT ExecutionIds:

XDocument doc = XDocument.Load(@"C:\Sample1.xml"); 
List<string> ids = doc.Descendants("pit").Elements().Select(i => i.Attribute("ExecutionID").Value).ToList(); 

上面的代碼加載從文件Sample1.xml的XML然後將所有executionIDs取成一個列表對象。如果需要檢查狀態值是否爲「0」,則可以向查詢添加更多條件。以下是條件代碼

List<string> ids = doc.Descendants("pit").Elements().Where(k=>k.Attribute("Status").Value == "0").Select(i => i.Attribute("ExecutionID").Value).ToList(); 

希望有所幫助。

0

你得到第一行的元素,因爲您的查詢呼籲「行」元素的後代即

xDoc.Root.Descendants( 「ROW」)

嘗試通過用下面的代碼替換此:

xDoc.Root.Descendants( 「坑」)

這將返回所有元素,它們是元素的後代。

+0

nope this doesnt work..I get this object reference exception with this – Navyseal

+0

他可以選擇「行」,它會返回所有「行」元素的集合。 「坑」會返回父元素,你必須事後不必要地迭代。 –

+0

我想我得到這個 executionIdList =(從結果xDoc.Root.Descendants( 「行」) 其中結果!= NULL && result.Attribute( 「狀態」)。Value.Equals( 「失敗」,StringComparison .CurrentCultureIgnoreCase) select int.Parse(result.Attribute(「ExecutionID」)。Value))。ToList(); – Navyseal

1

,你沒有得到結果的原因是因爲

IEnumerable<int> executionIds; 

executionIds = 
    from result in xDoc.Root.Descendants("ROW").Attributes("ExecutionID") 
    select int.Parse(result.Value); 

是你所需要的東西。你的函數在選擇部分包含了許多看似不必要的代碼(但這是你要判斷的),包括一個FirstorDefault語句,它只會選擇第一條記錄,或者如果沒有記錄存在,它將默認預定義的值。