使用linq读取xml属性

3
<ARTICLE_PRICE_DETAILS>
        <DATETIME type="valid_start_date">
          <DATE>2015-07-01</DATE>
        </DATETIME>
        <DATETIME type="valid_end_date">
          <DATE></DATE>
        </DATETIME>
</ARTICLE_PRICE_DETAILS>

如何获取 Element 中的值?
我尝试了以下方法:
   var productQuery = (from p in xmlDocument.Descendants("ARTICLE_PRICE_DETAILS")
                        select new
                        {

                            articleDatetime = p.Element("DATETIME")
                                               .Attribute("valid_start_date")
                                               .Value

                        });

当我尝试使用articleDatetime时,出现了异常。需要帮助。


你具体遇到了什么异常? - Andrey Korneyev
你没有名为“valid_start_date”的属性。你有一个名为“type”的属性。你想做什么? - Yacoub Massad
@YacoubMassad 感谢您的关注,您说得很对。 我使用了错误的属性名称。 - Selman
1个回答

3

看起来你正在尝试获取带有属性 type="valid_start_date"DATETIME 元素下的 DATE 值。

有多种方法可以实现,以下是其中之一:

var dates = xmlDocument
     .XPathSelectElements("ARTICLE_PRICE_DETAILS/DATETIME[@type='valid_start_date']/DATE")
     .Select(e => e.Value)
     .ToList();

请注意,这里大部分工作是通过XPathSelectElements方法和适当的xpath表达式完成的。

也可以通过仅使用几个linq调用来实现相同的结果,而不使用xpath选择,如下所示:

var xmlDocument = doc.Descendants("ARTICLE_PRICE_DETAILS")
                     .Descendants("DATETIME")
                     .Where(e => e.Attribute("type")?.Value == "valid_start_date")
                     .Descendants("DATE")
                     .Select(e => e.Value)
                     .ToList();

但是从我的角度来看,它的可读性较差。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接