Найти или создать элемент по xpath, используя LINQ-to-XML - PullRequest
7 голосов
/ 04 января 2011

Есть ли у кого-нибудь аккуратный способ поиска или создания XObject с использованием выражения xpath.

Проблема, с которой я столкнулся, заключается в том, что мне нужно установить значение элемента (для которого у меня есть xpath), который может существовать или не существовать.Если бы его не было, я бы хотел, чтобы он был создан.

Будем очень благодарны за любые подсказки или ссылки.

Спасибо всем.

Ответы [ 2 ]

1 голос
/ 04 января 2011

Вы можете использовать класс System.Xml.XPath.Extensions для оценки выражений XPath в XDocument.

http://msdn.microsoft.com/en-us/library/system.xml.xpath.extensions.aspx

Например:

using System.Xml.XPath;
...
XDocument doc = XDocument.Load("sample.xml");
var matching = doc.XPathEvaluate("//Book[@Title='Great Expectations']");  
// 'matching' could be an IEnumerable of XElements, depending on the query
0 голосов
/ 01 марта 2019

Предполагая простой путь, и вы просто хотите добавить некоторые данные в его конец.

Начиная с некоторых примеров данных:

var xml = XDocument.Parse(@"<?xml version=""1.0""?>
<messages>
  <request type=""MSG"">
    <header>
      <datestamp>2019-02-26T14:49:41+00:00</datestamp>
      <source>1</source>
    </header>
    <body>
      <title>Hi there</title>
    </body>
  </request>
</messages>
");

Это не будет работать, потому что узел продукта не существует:

xml.XPathSelectElement("/messages/request/body/product")
    ?.Add(new XElement("description", "A new product"));

Для этого вы можете определить свой собственный метод расширения:

public static class extensionMethods
{
    public static XElement FindOrAddElement(this XContainer xml, string nodeName)
    {
        var node = xml.Descendants().FirstOrDefault(x => x.Name == nodeName);
        if (node == null)
            xml.Add(new XElement(nodeName));
        return xml.Descendants().FirstOrDefault(x => x.Name == nodeName);
    }
}

И соедините их вместе, чтобы создать свой новый путь.

xml.FindOrAddElement("messages")
   .FindOrAddElement("request")
   .FindOrAddElement("body")
   .FindOrAddElement("product")
   ?.Add(new XElement("description", "A new product"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...