Определение пространств имен 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 в x="http...", я читал, что некоторые ставят "мой", некоторые ставят другие значения... и на страницах XMLStarlet нет справочной страницы для этого)

Любая идея, как использовать XMLStarlet с этим файлом XML и СОХРАНЯТЬ пространства имен в выводе?

(Я использую XML starlet для удаления некоторых узлов, которые я не использую. Это намного безопаснее, чем использовать команды оболочки)

Огромная благодарность тому, кто поможет ;)


person user2504789    schedule 20.06.2013    source источник


Ответы (2)


не понимая, что означает x в x="http..." я читал некоторые ставят "мой" некоторые ставят другие значения

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

Страница руководства отсутствует, объяснение есть в главе 5 руководства пользователя.

person npostavs    schedule 22.06.2013

Начиная с версии 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+).

person RASG    schedule 28.06.2017