XMLStarlet名称空间定义



我需要您帮助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是什么意思。我读到一些写"我的",一些写其他值…(XMLStarlet页面中没有这方面的手册页)

知道如何在这个XML文件中使用XMLStarlet并在输出中保留名称空间吗?

(我使用XML starlet来删除一些我不使用的节点。这样做比使用shell命令更安全)

不明白x="http…"中的x是什么意思我看到一些写着"我的"有些人写了其他值

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

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

-N选项必须遵循ed命令,如@reinierpost所述。

…没有手册页XMLStarlet页

手册页相当缺乏,在用户指南的第5章中有一个解释

从1.2.1版本开始,您可以使用默认命名空间_
(去掉-N参数)

xmlstarlet ed -d "/_:ncx/_:navMap/_:navPoint[@playOrder='5']" Myfile.ncx

如下所示:

1.3。更方便的解决方案

XML文档也可以使用不同的名称空间前缀元素。以便使用更大的因此,XMLStarlet(版本1.2.1+)将使用名称空间前缀在输入文档的根元素上声明。默认的命名空间将被绑定到前缀"_"one_answers"DEFAULT"(在版本1.5.0 +) .

相关内容

  • 没有找到相关文章

最新更新