Ответ 1
var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");
У меня есть следующий xml
<root>
<databases>
<db1 name="Name1" />
<db2 name="Name2" server="myserver" />
<db3 name="Name3" />
</databases>
<root>
Я пробовал все прочитать имя db2 (= "Name2" ) со всеми возможными комбинациями запросов XPath, но никогда не получал ожидаемого результата.
Мой код:
var query = "root/databases/db2.. "; // here I've tried everything
var doc = XDocument.Load("myconfig.xml");
var dbName = doc.XPathSelectElement(query);
Каков правильный запрос для получения моего "Name2" (значение атрибута)?
Спасибо за вашу помощь.
var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");
Метод XPathSelectElement может использоваться только для выбора элементов, а не атрибутов.
Для атрибутов вам нужно использовать более общий метод XPathEvaluate:
var result = ((IEnumerable<object>)doc.XPathEvaluate("root/databases/db2/@name"))
.OfType<XAttribute>()
.Single()
.Value;
// result == "Name2"
Чтобы получить значение (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);