如何使用命名空间获取xml中的特定节点?

时间:2013-06-23 05:51:45

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

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

enter image description here

我有兴趣从所有后代节点(条目)获取节点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();

2 个答案:

答案 0 :(得分:1)

我建议使用XNamespace而不是XName(个人偏好,主要是 - 因为我总是处理LINQ to XML中的命名空间)。对我而言,提前设置名称空间然后使用Element(NS + "element name") than to use XName.Get (though using XName.Get`的工作量减少了,如果你想做什么的话就完全没问题了

如果您想获得所有&#34; MediaUrl&#34;每个条目的元素,然后我做这样的事情:

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();

Thumbnail 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();

这里的关键是将命名空间与元素名称结合使用以便检索它。

答案 1 :(得分:0)

var query = from i in doc.Descendants("{full namespace for prefix d}MediaUrl")
                    select new Image()
        {
            Url = i.Value
        };