簡體   English   中英

使用過濾器使用Linq to XML提取CDATA上的內部值

[英]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語句中的項目? 否則,我不太了解如何使用我正在使用的代碼。

一如既往,我感謝您的幫助。

將每個XElement強制轉換為string

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
// }

這也適用於其他數據類型,例如intfloatDateTime等:

reviews = from item in xmlDoc.Descendants("node")
          select new 
          {
              PubDate = (DateTime)item.Element("created")
          };
// Output:
// {
//      PubDate = 1/23/2012 12:40:57
// }

它也可以與XAttribute一起使用

請記住,以下含義之間沒有區別:

<a>
 <b>Hello</b>
 <c>&amp; 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM