Как найти узел XML по пути в Linq-to-XML - PullRequest
6 голосов
/ 11 августа 2010

Если я получу путь к конкретному узлу в виде строки, могу ли я как-нибудь легко найти указанный узел, используя Linq / Method XElement (или XDocument).

Существует так много различных типов объектов XMLбыло бы также неплохо, если бы в качестве дополнительного бонуса вы могли бы указать мне руководство о том, почему / как использовать разные типы.

РЕДАКТИРОВАТЬ: Хорошо, после указания на XPathSelectElement я пробую это, чтобы я мог датьему правильный ответ, я не могу заставить его работать, хотя.Это XML-код, который я пробую

<Product>
  <Name>SomeName</Name>
  <Type>SomeType</Type>
  <Quantity>Alot</Quantity>
</Product>

и мой код

string path = "Product/Name";
string name = xml.XPathSelectElement(path).Value;

обратите внимание, что моя строка исходит из другого места, поэтому я думаю, что она не должна быть буквальной (вменьше всего в режиме отладки это выглядит как выше).Я также попытался добавить / впереди.Это дает мне нулевую ссылку.

Ответы [ 2 ]

11 голосов
/ 11 августа 2010

Попробуйте использовать XPathSelectElement метод расширения XElement. Вы можете передать методу выражение XPath для оценки. Например:

XElement myElement = rootElement.XPathSelectElement("//Book[@ISBN='22542']");

Редактировать

В ответ на ваши изменения проверьте выражение XPath. Если ваш документ содержит только этот небольшой фрагмент, тогда /Product/Name будет работать, так как ведущий слеш выполняет поиск в корне документа:

XElement element = document.XPathSelectElement("/Product/Name");

Если есть другие продукты и <Product> не является корневым узлом, вам необходимо изменить используемый вами XPath.

7 голосов
/ 11 августа 2010

Вы также можете использовать XPathEvaluate

XDocument document = XDocument.Load("temp.xml");
var found = document.XPathEvaluate("/documents/items/item") as IEnumerable<object>;
foreach (var obj in found)
{
    Console.Out.WriteLine(obj);    
}

Учитывая следующее xml:

<?xml version="1.0" encoding="utf-8" ?>
<documents>
  <items>
    <item name="Jamie"></item>
    <item name="John"></item>
  </items>
</documents>

Это должно напечатать содержимое из узла items.

...