[英]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.