2013-06-20 51 views
1

我需要您对XMLStarlet命名空间的帮助。 (从不觉得不好解释库) 我有这样一个XML文件:XMLStarlet命名空间定义

<?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是什么意思x =“http ...”我读了一些把“我的”一些放在其他值...并且在XMLStarlet页面没有这个页面)

任何想法如何在这个XML文件中使用XMLStarlet并在输出中保留命名空间?

(我用XML明星删除一些节点,我不使用它的方式更安全,使这种方式,而不是使用shell命令。)

巨大的感谢谁帮助;)

回答

4

不理解什么是指在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页

该名男子页相当缺乏,存在chapter 5 of the user's guide解释。

0

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

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

至于解释here

1.3。更方便的解决方案

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