我有以下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”(属性值)的正确查询是什么?
感谢您的帮助。
答案 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);