繁体   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