【问题标题】:How to get an specific node in xml with namespaces?如何使用命名空间获取 xml 中的特定节点?
【发布时间】:2013-06-19 22:22:19
【问题描述】:

我正在处理从 XML 文档访问特定节点。我意识到这是一个基本命名空间。这是一个例子。

我有兴趣从所有后代节点(条目)获取节点 d:MediaUrl 的值。而我还没有做到这一点。

当我调试变量迭代器“i”时,我可以看到 XML 再次包含默认命名空间,类似于:

<entry xmlns="http://schemas.microsoft.com.ado/..." 

而且我还必须包含另一个名为“d”的命名空间。

我可以做些什么来访问那些特定的节点?

这就是我所拥有的。

        var doc = XDocument.Parse(result);

        string BASE_NS = "http://www.w3.org/2005/Atom";

        string d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
        var query = from i in doc.Descendants(XName.Get("entry", BASE_NS))
                    select new Image()
        {
            Url = i.Element(XName.Get("MediaUrl", BASE_NS)).Value
        };

        var results = query.ToList();

【问题讨论】:

  • 另外,您的选择不起作用,因为“MediaURL”不是“Entry”的子代,它是“Thumbnail”的子代 - i.Element("content").Element("properties").Element("Thumbnail").Element("MediaUrl")(为简洁起见,省略了命名空间)。
  • 谢谢蒂姆。 i.Element("content") 不幸返回 null,我必须包含任何命名空间吗?
  • 您想要每个“条目”中的所有“MediaUrl”元素,还是只想要一个?每个条目中有两个 - 一个在属性下,一个在缩略图下。
  • 要回答您之前的问题,对于那些没有命名空间前缀的元素(如“内容”),您需要使用默认命名空间(即“Feed”中的xmlns="http://www.w3.org/2005/atom"你的例子的元素。要离开我下面的例子,它将是XNamespace a = "http://www.w3.org/2005/atom";,然后是Descendants(a + "content")

标签: c# xml linq xml-parsing linq-to-xml


【解决方案1】:

我建议使用XNamespace 而不是XName(主要是个人偏好 - 因为这就是我一直在处理 LINQ to XML 中的命名空间的方式)。对我来说,提前设置命名空间然后使用 Element(NS + "element name") than to useXName.Get(though usingXName.Get 会更省力,如果这是你想做的,那是完全可以的。

如果您想为每个条目获取所有“MediaUrl”元素,那么我会这样做:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";

var query = (from i in doc.Descendants(d + "MediaUrl")
             select new Image()
             {
                 Url = i.Value
             }).ToList();

如果您只想获得其中一个,那么您需要做一些不同的事情,这取决于您想要获得哪一个。

对于属性 MediaUrl:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";

var query = (from i in doc.Descendants(m + "properties")
             select new Image()
             {
                 Url = i.Element(d + "MediaUrl").Value
             }).ToList();

对于缩略图 MediaUrl:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";

var query = (from i in doc.Descendants(d + "Thumbnail")
             select new Image()
             {
                 Url = i.Element(d + "MediaUrl").Value
             }).ToList();

这里的关键是使用命名空间和元素名称来检索它。

【讨论】:

    【解决方案2】:
    var query = from i in doc.Descendants("{full namespace for prefix d}MediaUrl")
                        select new Image()
            {
                Url = i.Value
            };
    

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多