C# Linq to XML 元素

C# Linq to XML Element

正在解决一个问题,我似乎无法遍历元素并将日期值从 xml 转换为日期时间,然后打印出日期大于 [=17= 的所有元素] 到控制台的日期。 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>

在我的代码中,我有一个列表,我想通读它并输出其中日期大于 'some hardcoded date' 的所有元素。我意识到我可以为 的后代中的每个元素设置一个 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);}

您正试图直接从 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)
);