4

示例 XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

我在我的 shell 上使用 xpath 来尝试更改 xml 节点的文本值。我想把哈利波特改成荆棘游戏。

xpath test.xml "//bookstore/book/title/text()" 2>/dev/null

将在我的终端上回显哈利波特。现在是否可以使用 xpath 将节点的值从 Harry Potter 更改为 Game of Thornes?

谢谢!

4

2 回答 2

8

XPath 本身不能用于修改 XML 文档。但是xmlstarlet命令行实用程序可以做到这一点。例子:

xml ed -u "//book[1]/title" -v "Game of Thrones" bookstore.xml

输出:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Game of Thrones</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>

注意:没有[1]在表达式中,结果将是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Game of Thrones</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Game of Thrones</title>
    <price>39.95</price>
  </book>
</bookstore>

上面的命令将结果输出到标准输出。有一个选项(-L--inplace)可以修改文档:

xml ed -L -u "//book[1]/title" -v "Game of Thrones" bookstore.xml 

xmlstarlet 1.3.1的文档中没有提到这个选项,但是执行的时候会显示

xml ed --help
于 2012-04-09T10:14:14.953 回答
1

据我所知,XPath 本身不能用于此,因为它只是一种查询语言,所以不能用于创建或修改 XML 文件。为此,您将需要一些其他工具。如果您喜欢命令行工具,也许可以检查xsltproc,它是libxslt. 我不是XSLT专家,但快速浏览链接页面让我感觉您可以使用<if>和实现所需的结果<value-of>。或者您可以使用正则表达式解析 XML,但请不要,我听说这是一个滑坡。

于 2012-04-09T09:04:32.860 回答