使用xpath设置节点的文本值

时间:2012-04-09 08:31:04

标签: xml bash xpath

示例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吗?

谢谢!

2 个答案:

答案 0 :(得分: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>

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

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

xmlstarlet 1.3.1的文档中未提及此选项,但在执行

时会显示该选项
xml ed --help

答案 1 :(得分:1)

据我所知,XPath本身不能用于此,因为它只是一种查询语言,因此不能用于创建或修改XML文件。你需要一些其他的工具。如果您使用命令行工具,可以选中xsltproc,这是libxslt的一部分。我不是XSLT专家,但快速查看链接页面会让我感觉您可以使用<if><value-of>获得所需的结果。或者你可以parse XML with regular expressions,但请不要,我听说它是​​一个滑坡。