2017-04-20 166 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