2013-06-20 184 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+)。