【问题标题】:Parse XML Elements with LINQ使用 LINQ 解析 XML 元素
【发布时间】:2011-07-23 10:22:34
【问题描述】:

我有这个 xml。

<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="el-gr" xmlns="http://www.w3.org/2005/Atom">
<title type="text">name.gr</title>
<updated>2011-07-23</updated>
<link href="link" />
<entry>    
  <title type="html">Οι επιθέσεις σε σκανδιναβικές χώρες</title>
  <summary type="text">Η Νορβηγία, μία από τις σκανδιναβικές χώρες, έζησε μετά από πάρα  πολλά χρόνια (2006) τον τρόμο. Δείτε αναλυτικά τις τελευταίες «τυφλές» επιθέσεις τα τελευταία χρόνια:...</summary>
  <published>2011-07-23T12:54:00+03:00</published>    
  <link href="link" />
</entry>

我想解析里面的一些元素。为此,我使用以下 LINQ 代码。

var list = from y in xelement.Descendants("entry")
           select new Update()
           {
               Title = y.Element("title").Value,
               Pubdate = y.Element("published").Value,
               Descr = y.Element("content").Value,
               Link = y.Element("link").Attribute("href").Value
           };

但它不起作用。谁能告诉我我做错了什么?

【问题讨论】:

  • 您正在尝试检索 XML 中不存在的名为 content 的元素,这不应该是 summary 吗?

标签: c# linq-to-xml


【解决方案1】:

节点都在http://www.w3.org/2005/Atom 命名空间中。因此,您需要使用此命名空间为查询添加前缀,否则查询会尝试在空命名空间中查找这些元素。

XNamespace atom = "http://www.w3.org/2005/Atom";
var list = from y in xelement.Descendants(atom+"entry")
               select new Update()
               {
                   Title = y.Element(atom+"title").Value,
                   Pubdate = y.Element(atom+"published").Value,
                   Descr = y.Element(atom+"content").Value,
                   Link = y.Element(atom+"link").Attribute("href").Value
               };

【讨论】:

  • 不是只有在每个 XML 元素都标有适当的 NS 前缀时才适用吗?例如&lt;atom:title... /&gt;.
  • 没有。根 XML 元素 (feed) 使用 xmlns 属性重新定义空/默认命名空间前缀。因此,以定义 xmlns 的元素开头的所有元素都在该命名空间中(除非重新定义)。
【解决方案2】:

在您的 XML 示例中,缺少“提要”结束标签,并且您使用的是元素“内容”,但我猜“摘要”是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多