XPath和XPathSelectElement

gsh*_*arp 16 .net c# xml xpath linq-to-xml

我有以下xml

<root>
   <databases>
      <db1 name="Name1" />
      <db2 name="Name2" server="myserver" />
      <db3 name="Name3" />
   </databases>
<root>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有内容来读取db2(="Name2")的名称以及XPath查询的所有可能组合,但从未获得预期的结果.

我的代码到目前为止:

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

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

谢谢你的帮助.

dtb*_*dtb 35

XPathSelectElement方法只能用于选择元素,而不是属性.

对于属性,您需要使用更通用的XPathEvaluate方法:

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

// result == "Name2"
Run Code Online (Sandbox Code Playgroud)


Ale*_*Aza 19

var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");
Run Code Online (Sandbox Code Playgroud)

  • 请注意,由于XPathSelectElement是一个扩展方法,因此需要使用以下using语句:`using System.Xml.XPath;` (5认同)

Mer*_*ham 13

要获取元素Name2name属性value()db2,请尝试以下方法:

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

如果您不知道element(db2)的名称,但确实知道它有server属性,请尝试以下方法:

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

如果你想做与前一个例子相同的事情,但是有多个带有server属性的元素,并且你想在这些元素之间进行选择,请尝试这样做:

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