【问题标题】:Xelement - get elementsXelement - 获取元素
【发布时间】:2014-01-07 14:29:27
【问题描述】:

我正在将一个 xml 提要从 youtube 加载到 xelement 中,如下所示:

  XElement element = XElement.Load(url);

这很好,我得到一个如下所示的文档:

<?xml version='1.0' encoding='UTF-8' ?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:opensearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
  <id>http://gdata.youtube.com/feeds/api/users/id/uploads</id>
  <updated>2014-01-07T11:43:08.269Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
  <title type='text'>Uploads by id</title>
  <logo>http://www.gstatic.com/youtube/img/logo.png</logo>
  <link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/stonemarketuk'/>
  <link rel='alternate' type='text/html' href='https://www.youtube.com/channel/333/videos'/>
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads'/>
  <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads/batch'/>
  <link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads?start-index=1&amp;max-results=25'/>
  <link rel='next' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads?start-index=26&amp;max-results=25'/>
  <author>
    <name>StonemarketUK</name>
    <uri>https://gdata.youtube.com/feeds/api/users/id</uri>
  </author>
  <generator version='2.1' uri='http://gdata.youtube.com'>YouTube data API</generator>
  <openSearch:totalResults>30</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
  <entry>
      ....entry elements
  </entry>
  <entry>
      ....entry elements
  </entry>
</feed>

如何获取入口元素?我尝试了以下方法:

var entries = element.Elements("entry");
var entries = element.Element("feed").Elements("entry");
var entries = element.Nodes().Elements("entry");

但是这些都没有返回任何东西

我也调试并尝试了element.Elements().FirstOrDefault(),但这返回了 null。 element.Nodes().Count() 返回 41 那么我应该尝试获取名为 entry 的节点吗?

【问题讨论】:

    标签: c# xml xelement


    【解决方案1】:

    所有元素都在一个命名空间 (xmlns='http://www.w3.org/2005/Atom') 中。您必须声明原子命名空间并使用它。

    很简单:

    XNamespace atom = "http://www.w3.org/2005/Atom";
    
    var xml = XElement.Load(url);
    var entry = xml.Elements(atom + "entry");
    

    等等

    获取正确元素名称的一种简单方法是使用XName.Get()。如果你只有一个命名空间,你可以把它放在一个单独的函数中:

    internal static XName GetXName(string name)
    {
        string atomNamespace = "http://www.w3.org/2005/Atom";
        return XName.Get(name, atomNamespace);
    }
    

    【讨论】:

    • 非常感谢,当您知道如何操作时,这就是如此简单!让我在 3 分钟内接受
    【解决方案2】:

    试试下面的

    var entryList = element.Elements().Where(x => x.Name.LocalName == "entry");
    

    这里的问题是每个没有显式命名空间的元素都隐含在命名空间"http://www.w3.org/2005/Atom" 中。 LocalName 属性仍可用于访问简单名称,如上所示。除非您需要构造一个正确的 XName 元素,其中包含此命名空间以匹配“入口”节点

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多