XPath и XPathSelectElement - PullRequest
       38

XPath и XPathSelectElement

16 голосов
/ 09 июня 2011

У меня есть следующий 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" (значение атрибута)?

Спасибо за вашу помощь.

Ответы [ 3 ]

34 голосов
/ 09 июня 2011

Метод XPathSelectElement может использоваться только для выбора элементов, но не атрибутов.

Для атрибутов вам нужно использовать более общий XPathEvaluate метод :

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

// result == "Name2"
17 голосов
/ 09 июня 2011
var dbName = doc.XPathSelectElement("root/databases/db2").Attribute("name");
13 голосов
/ 09 июня 2011

Чтобы получить значение (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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...