[英]Extracting inner value on CDATA with Linq to XML using a filter
我正在使用以下代码从XML中检索所需的值:
IEnumerable<ForewordReview> reviews = null;
try
{
reviews = from item in xmlDoc.Descendants("node")
select new ForewordReview()
{
PubDate = item.Element("created").ToString(),
Isbn = item.Element("isbn").ToString(),
Summary = item.Element("review").ToString()
};
} // ...
顺便说一句,一个客户现在向我们传递了几乎所有我需要提取的带有CDATA的标签:
<review>
<node>
<created>
<![CDATA[2012-01-23 12:40:57]]>
</created>
<isbn>
<![CDATA[123456789]]>
</isbn>
<summary>
<![CDATA[Teh Kittehs like to play in teh mud]]>
</summary>
</node>
</review>
我已经看到了几种从CDATA标记中提取这些值的解决方案,其中一种是在LINQ语句上使用where子句:
where element.NodeType == System.Xml.XmlNodeType.CDATA
我有点了解这里发生了什么,但是我不确定这是否可以与我使用Linq的方式一起工作(具体而言,是从选定的项目中构建对象。
我是否需要将此过滤器分别应用于select语句中的项目? 否则,我不太了解如何使用我正在使用的代码。
一如既往,我感谢您的帮助。
reviews = from item in xmlDoc.Descendants("node")
select new
{
PubDate = (string)item.Element("created"),
Isbn = (string)item.Element("isbn"),
Summary = (string)item.Element("summary")
};
// Output:
// {
// PubDate = 2012-01-23 12:40:57,
// Isbn = 123456789,
// Summary = Teh Kittehs like to play in teh mud
// }
这也适用于其他数据类型,例如int
, float
, DateTime
等:
reviews = from item in xmlDoc.Descendants("node")
select new
{
PubDate = (DateTime)item.Element("created")
};
// Output:
// {
// PubDate = 1/23/2012 12:40:57
// }
请记住,以下含义之间没有区别:
<a>
<b>Hello</b>
<c>& hello again</c>
</a>
和的
<a>
<b><![CDATA[Hello]]></b>
<c><![CDATA[& hello again]]></c>
</a>
由于您正在调用ToString()
并以XML形式返回整个内容-打开和关闭标签,实体引用等,因此您必须准备好以XML形式处理它。 如果不是,那么问题不在于您在此处显示的代码, PubDate
因为PubDate
是"<created>2012-01-23 12:40:57</created>"
,现在"<created>2012-01-23 12:40:57</created>"
它是完全等效的“”;
要么更改该代码以真正解析XML(框架为之提供了很多帮助),要么更改它以单独获取日期并使用Element("created").Value
检索它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.