5

我需要您在 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 in x="http..." 中的 x 是什么意思,我读了一些放“我的”,一些放了其他值......在 XMLStarlet 页面中没有这方面的手册页)

知道如何将 XMLStarlet 与此 XML 文件一起使用并在输出中保留名称空间吗?

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

非常感谢帮助的人;)

4

2 回答 2

4

不明白 x in x="http..." 中的 x 是什么意思 我读到一些放“我的”一些放其他值

Thex是您赋予命名空间的名称。然后,您必须在查询中使用它:

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 页面中没有这方面的手册页

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

于 2013-06-22T13:36:06.613 回答
4

从版本 1.2.1 开始,您可以使用 de default 命名空间_
(删除-N参数)

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

如此处所述:

1.3. 更方便的解决方案

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

于 2017-06-28T18:06:07.533 回答