2012-06-27 70 views
18

我想查询给定路径的XDocument对象(例如“/ path/to/element/I/want”),但我不知道如何继续。如何使用'路径'查询XDocument?

+0

可能重复[如何使用XPath与XDocument?](http://stackoverflow.com/questions/6209841/how-to-use-xpath-with -xdocument) –

+0

你可以在这里看到一个选择不同路径的示例,带/不带名称空间定义等等:http://stackoverflow.com/a/38272604/5838538。 – Jelgab

回答

2

soemthing相似,这可能工作:

var path = "/path/to/element/I/want"; 
var route = path.Split(new []{'/'}, StringSplitOptions.RemoveEmptyEntries); 

XElement result = null; 
foreach (var node in route) 
{ 
    if (result == null) 
    { 
     result = _xmlDocument.Element(node);  
    } 
    else 
    { 
     result = result.Element(node); 
    } 
} 

return result; 
+1

'RemoveEmptyEntries'不是一个好主意,''//在XPath中具有特定的含义,它是搜索所有的后代。 – svick

41

可以使用的方法从System.Xml.XPath.Extensions做到这一点。

例如,如果你想选择一个单一的元素,你可以使用XPathSelectElement()

var element = doc.XPathSelectElement("/path/to/element/I/want"); 

的查询不必像你所描述的简单路径,他们所使用的语言XPath

+6

在4.5中,使用System.Xml.XPath。 – lionheart

+6

@lionheart这不正是我所建议的吗?而System.Xml.XPath命名空间在.Net 4.5中当然不是新的。 – svick

4

尽管这是一种比较旧后,应当注意的是,LINQ-to-XML可以用作替代System.XML.XPathXDocument

实施例中找到基于路径上的元素:

var results = x.Elements("path").Elements("to").Elements("element").Elements("I").Elements("want").FirstOrDefault(); 

注意:可能需要更改LINQ to XML命令以适应XML的实际结构和/或基数。

https://msdn.microsoft.com/en-us/library/bb675156.aspx

0

我需要做类似的事情。这repo有几个单元测试演示XDocument查询与XPathEvaluate()