2017-04-20 132 views
0

處理一個問題,我似乎無法遍歷元素並將日期值轉換爲xml中的日期時間,然後打印出日期大於「x」日期的所有元素控制檯。 XML文件相當大,但這裏是一個示例。C#Linq to XML元素

<DataSet> 
    <diffgr:diffgram xmls=""> 
     <NewDataSet> 
      <USER_LOGIN> 
       <USER_LOGIN_ID>123</USER_LOGIN_ID> 
       <DATE>2017-03-01T16:56:16.59-06:00</<DATE> 
      </USER_LOGIN> 
      <CONTENT> 
       <CONTENT_ID>123</CONTENT_ID> 
       <DATE>2017-03-01T16:56:16.59-06:00</<DATE> 
      </CONTENT> 
       ETC. ETC. 
     <NewDataSet> 
    </diffgr:diffgram> 
<DataSet> 

在我的代碼我有,我想通過閱讀和輸出裏面哪裏日期比「硬編碼的一些日期」更大的所有元素的列表。我意識到我可以爲後代中的每個元素都有一個foreach循環,但我希望這是動態的,因爲有更多的元素必須循環通過比我的示例。這是我目前的代碼。這會失敗,並在我的代碼中的where子句中顯示Null異常。如果我刪除where子句,它將打印所有元素。

XDocument doc= XDocument.Load("xmlfile.xml"); 
DateTime testDate= new DateTime(2017, 03, 01); 

IEnumerable<XElement> textSeg= 
     from element in doc.Descendants("NewDataSet") 
     where (DateTime)element.Element("DATE")>testDate 
     select element; 

     foreach (XElement element in textSeg) 
     {Console.Writeline(element);} 
+0

的[這]可能的複製(http://stackoverflow.com/questions/4570185/how-用datetime-value-using-linq-to-xml查詢)SO問題。 –

+0

看來可能你有一些沒有DATE元素的節點?試着查詢你的數據來找到'where element.Element(「DATE」)== null'或添加'DateTime'類型轉換,並查看哪些節點有問題。 – NetMage

回答

1

您試圖直接從USER_LOGIN元素和CONTENT元素獲取DATE元素;你需要訪問他們的孩子元素。

(請原諒我使用method syntax over query syntax,這是我喜歡)

gist here

var dateElements = doc.Descendants("NewDataSet") 

// gather all the child-elements of all NewDataSet elements 
.SelectMany(dataSetEle => dataSetEle.Elements()) 

// filter out child-elements that themselves have no applicable DATE child-elements 
.Where(childEle => childEle.Elements() 
    .Any(grandChildEle => 
     grandChildEle.Name == "DATE" && (DateTime) grandChildEle > testDate) 
); 
+0

感謝您的回覆。這隻打印出DATE元素,但我希望輸出也打印塊中的所有其他元素。因此,如果date> testdate,我想以這種格式打印出來。 ** 123 2017-03-01T16:56:16.59-06:00 2017-03-01T16:56:16.59- 06:00 等。等等。 ** – user7897499

+0

我已經更新了我的答案,以返回包含DATE元素的元素,而不是DATE元素本身。 –

+0

太棒了,謝謝。 – user7897499