XPath和XPathSelectElement

时间:2011-06-09 08:00:16

标签: c# .net xml xpath linq-to-xml

我有以下xml

<root>
   <databases>
      <db1 name="Name1" />
      <db2 name="Name2" server="myserver" />
      <db3 name="Name3" />
   </databases>
<root>

我已尝试用XPath查询的所有可能组合来读取db2(=“Name2”)的名称,但从未得到预期的结果。

我的代码到目前为止:

var query = "root/databases/db2.. "; // here I've tried everything 
var doc = XDocument.Load("myconfig.xml");
var dbName =  doc.XPathSelectElement(query);

获取“Name2”(属性值)的正确查询是什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分:34)

XPathSelectElement method只能用于选择元素,而不能用于选择属性。

对于属性,您需要使用更通用的XPathEvaluate method

var result = ((IEnumerable<object>)doc.XPathEvaluate("root/databases/db2/@name"))
                                      .OfType<XAttribute>()
                                      .Single()
                                      .Value;

// result == "Name2"

答案 1 :(得分:17)

var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");

答案 2 :(得分:13)

要获取Name2元素的name属性的值(db2),请尝试以下操作:

    var query = "root/databases/db2";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);

如果您不知道元素的名称(db2),但确实知道它具有server属性,请尝试以下操作:

    var query = "root/databases/*[@server]";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);

如果您想要执行与上一个示例相同的操作,但是有多个元素具有server属性,并且您想在这些元素之间进行选择,请尝试以下操作:

    var query = "root/databases/*[@server='myserver']";
    var doc = XDocument.Load("myconfig.xml");
    var dbElement = doc.XPathSelectElement(query);
    Console.WriteLine(dbElement.Attribute("name").Value);