使用LINQ-to-XML通过xpath查找或创建元素

时间:2011-01-04 14:04:39

标签: c# linq-to-xml xpath

有没有人有一种使用xpath表达式查找或创建XObject的简洁方法。

我遇到的问题是我需要在元素上设置一个值(我有xpath),这可能存在也可能不存在。如果它不存在,我希望它被创建。

非常感谢任何提示或链接。

谢谢大家。

2 个答案:

答案 0 :(得分:1)

您可以使用System.Xml.XPath.Extensions类来评估XDocument上的XPath表达式。

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

答案 1 :(得分:0)

假设一条简单的路径,而您只想在其末尾添加一些数据。

从一些示例数据开始:

    $items = DB::select(DB::raw('SELECT * FROM items WHERE items.id = '.$id.'  ;'));
    foreach($items as $item){
           $product = DB::select(DB::raw(' select * from product
                 where product_id = '. $id.';' ));

          $item->add_whatever_element_you_want = $product;
    }

这不起作用,因为产品节点不存在:

$app->group('/utils', function () use ($app) {
    $app->get('/date', function ($request, $response) {
        return $response->getBody()->write(date('Y-m-d H:i:s'));
    });
    $app->get('/time', function ($request, $response) {
        return $response->getBody()->write(time());
    });
})->add(function ($request, $response, $next) {
    $response->getBody()->write('It is now ');
    $response = $next($request, $response);
    $response->getBody()->write('. Enjoy!');

    return $response;
});

为此,您可以定义自己的扩展方法:

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"));