xmlstarlet не возвращает никакого значения для определенного элемента

Происходит следующее:

Файл, который работает как положено:

Список того, что находится в xml:

# xmlstarlet el -a table.xml
table
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField

Выбор определенного элемента:

# xmlstarlet sel -t -v "//table/rec/numField" table.xml
123
346
-23

Необработанные данные:

#cat table.xml
<?xml version="1.0" encoding="UTF-8"?>
<table>
  <rec id="1">
    <numField>123</numField>
    <stringField>String Value</stringField>
  </rec>
  <rec id="2">
    <numField>346</numField>
    <stringField>Text Value</stringField>
  </rec>
    <rec id="3">
    <numField>-23</numField>
    <stringField>stringValue</stringField>
  </rec>
</table>

Следующий запуск с test.xml

# xmlstarlet el -a test.xml

filelists
filelists/@xmlns
filelists/@packages
filelists/package
filelists/package/@pkgid
filelists/package/@name
filelists/package/@arch
filelists/package/version
filelists/package/version/@epoch
filelists/package/version/@ver
filelists/package/version/@rel
filelists/package/file
filelists/package/file
filelists/package/file
filelists/package/file
filelists/package/file/@type

Запрос так же, как и предыдущий:

# xmlstarlet sel -t -v "//filelists/package/file" test.xml
#

Содержимое файла:

#cat test.xml
<?xml version="1.0" encoding="UTF-8"?>
  <filelists xmlns="http://linux.duke.edu/metadata/filelists" packages="8">
    <package pkgid="fc2a76ba4e6e0b2bc704b9e7bcb205ca1c11e93b" name="bigtop-utils" arch="noarch">
      <version epoch="0" ver="0.4+300" rel="1.cdh4.0.1.p0.1.el6"/>
      <file>/etc/default/bigtop-utils</file>
      <file>/usr/libexec/bigtop-detect-javahome</file>
      <file>/usr/share/doc/bigtop-utils-0.4+300/LICENSE</file>
      <file type="dir">/usr/share/doc/bigtop-utils-0.4+300</file>
    </package>
  </filelists>

I guess I don't get something here.

Почему я не могу отобразить содержимое этих файловых тегов? Мне нужно как-то избежать этого?


person Istvan    schedule 05.12.2013    source источник
comment
xml sel показывает содержимое того, что вы просили показать. Как то, что вы видите, не соответствует вашим ожиданиям?   -  person rici    schedule 05.12.2013
comment
Извините, вторая часть моего сообщения была опущена.   -  person Istvan    schedule 06.12.2013


Ответы (2)


Вы должны объявить пространство имен с помощью переключателя -N и использовать его для всех элементов внутри его области (обратите внимание, что я разбил команду на строки, чтобы избежать прокрутки markdown):

xmlstarlet sel \
    -N 'x=http://linux.duke.edu/metadata/filelists' \
    -t \
    -v \
    "//x:filelists/x:package/x:file" \
test.xml

Это дает:

/etc/default/bigtop-utils
/usr/libexec/bigtop-detect-javahome
/usr/share/doc/bigtop-utils-0.4+300/LICENSE
/usr/share/doc/bigtop-utils-0.4+300
person Birei    schedule 05.12.2013

Начиная с версии 1.2.1 вы можете использовать пространство имен по умолчанию _
(удалите аргумент -N)

xmlstarlet sel -t -v "//_:filelists/_:package/_:file" test.xml

Как описано здесь:

1.3. Более удобное решение

XML-документы также могут использовать различные префиксы пространств имен для любого элемента документа. Чтобы упростить работу с пространствами имен, XMLStarlet (версии 1.2.1+) будет использовать префиксы пространств имен, объявленные в корневом элементе входного документа. Пространство имен по умолчанию будет привязано к префиксам "_" и "DEFAULT" (в версиях 1.5.0+).

person RASG    schedule 28.06.2017