XMLStarlet命名空间定义

5
我可以帮助您翻译有关XMLStarlet的命名空间问题。我有一个像这样的XML文件:

我需要你为 XMLStarlet 的命名空间问题提供帮助。(从未看过如此糟糕的解释库) 我有一个类似以下的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx version="2005-1" xml:lang="fr" xmlns="http://www.daisy.org/z3986/2005/ncx/">
<head>
<meta name="dtb:uid" content="9782721213747"/>
<meta name="dtb:depth" content="1"/>
<meta name="dtb:totalPageCount" content="0"/>
<meta name="dtb:maxPageNumber" content="0"/>
</head>
<docTitle>
<text>My text</text>
</docTitle>
<navMap>
<navPoint id="NavPoint-1" playOrder="1"><navLabel><text>Couverture</text></navLabel><content src="01_cover.html"/></navPoint>

所以,由于存在命名空间,我的XMLstarlet查询失败了。

等等,还有其他问题。

xmlns="http://www.daisy.org/z3986/2005/ncx/"

我了解到你可以使用SED移除命名空间,就像这样:

cat Myfile.ncx | sed -e 's/ xmlns.*=".*"//g' | xmlstarlet ed -d "/ncx/navMap/navPoint[@playOrder='5']"

这个方法可以正常工作。问题是,我需要命名空间,不想将它们删除。

另外,我已经尝试过以下方法:

xmlstarlet -N x="http://www.daisy.org/z3986/2005/ncx/" ed -d "/ncx/navMap/navPoint[@playOrder='5']" Myfile.ncx

无效(也不理解x =“http ...”中的x是什么意思。我看到有些人使用“my”,有些人使用其他值... XMLStarlet页面中也没有man页面)

有没有办法在输出中保留此XML文件的命名空间,同时使用XMLStarlet删除某些未使用的节点?

(我使用XML starlet删除一些未使用的节点。这种方式比使用shell命令更安全)

非常感谢帮助的人;)

2个回答

4
从版本1.2.1开始,您可以使用默认命名空间_(删除-N参数)。
xmlstarlet ed -d "/_:ncx/_:navMap/_:navPoint[@playOrder='5']" Myfile.ncx

此文档所述:

1.3. 更方便的解决方案

XML文档中的任何元素也可以使用不同的命名空间前缀。为了更轻松地处理命名空间,XMLStarlet(版本1.2.1+)将使用输入文档根元素上声明的命名空间前缀。默认命名空间将绑定到前缀“_”和“DEFAULT”(在版本1.5.0+中)。


这就是JSON出现的原因...我只需要在XPath元素前面添加下划线前缀,至少对于我使用的文档来说,才能选择任何内容! - Pysis

4

不理解 x="http..." 中的 x 是什么意思,我看到一些人用了 "my",而其他人用了其他值

x 是您给命名空间指定的名称。然后您必须在查询中使用它:

xmlstarlet ed -N x="http://www.daisy.org/z3986/2005/ncx/" -d "/x:ncx/x:navMap/x:navPoint[@playOrder='5']" Myfile.ncx

正如 @reinierpost 所指出的那样,-N选项必须跟随ed命令。

... 而且在XMLStarlet页面中没有该命令的man页。

该命令的man页相当缺乏,但在用户指南的第5章中有解释。(链接)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接