示例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吗?
谢谢!
发布于 2012-04-09 18:14:15
XPath本身不能用于修改文档。但是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发布于 2012-04-09 17:04:33
据我所知,XPath本身不能用于此目的,因为它只是一种查询语言,所以它不用于创建或修改XML文件。为此,您需要一些其他工具。如果您对命令行工具感兴趣,也许可以查看libxslt中的xsltproc。我不是XSLT专家,但是快速浏览一下链接页面会让我觉得使用<if>和<value-of>可以达到预期的效果。或者你可以parse XML with regular expressions,但请不要,我听说这是一个滑坡路。
https://stackoverflow.com/questions/10070746
复制相似问题