示例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吗?
谢谢!
答案 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,但请不要,我听说它是一个滑坡。