LINUX.ORG.RU

Oчередной раз распарсить primary.xml

 ,


0

2

Всем привет.

Понадобилось распарсить стандартный primary.xml в консоле. Запускаю xmllint --xpath «//*/*/@name='XXX'» primary.xml но получаю true вместо значения.Сам файл выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:suse="http://novell.com/package/metadata/suse/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="2152">
<package type="rpm">
  <name>ZZZZZZ</name>
  <arch>i586</arch>
  <version epoch="0" ver="0.735" rel="1.10"/>
  <checksum type="sha" pkgid="YES">0d519e1d7d455352525b40f8e21db563decc15c3</checksum>
  <summary>A Tool to Verify the 3D Configuration</summary>
  <description>With 3Ddiag you can verify the 3D configuration.



Authors:
--------
    Stefan Dirsch &lt;sndirsch@suse.de&gt;</description>
  <packager>http://bugs.opensuse.org</packager>
  <url></url>
  <time file="1210095650" build="1208992146"/>
  <size package="30622" installed="48531" archive="50300"/>
<location href="rpm/i586/3ddiag-0.735-1.10.i586.rpm"/>
  <format>
    <rpm:license>GPL v2 or later</rpm:license>
    <rpm:vendor>SUSE LINUX Products GmbH, Nuernberg, Germany</rpm:vendor>
    <rpm:group>System/Base</rpm:group>
    <rpm:buildhost>bragg.suse.de</rpm:buildhost>
    <rpm:sourcerpm>3ddiag-0.735-1.10.src.rpm</rpm:sourcerpm>
    <rpm:header-range start="448" end="16920"/>
    <rpm:provides>
      <rpm:entry name="3ddiag" flags="EQ" epoch="0" ver="0.735" rel="1.10"/>
    </rpm:provides>
    <rpm:requires>
      <rpm:entry name="/bin/sh"/>
      <rpm:entry name="libsysfs.so.1"/>
    </rpm:requires>    <file>/usr/bin/3Ddiag.devel</file>
    <file>/usr/bin/3Ddiag.nvidia_glx</file>
    <file>/usr/bin/3Ddiag.ignoredb</file>
  </format>
</package>
<package type="rpm">
  <name>XXX</name>
  <arch>noarch</arch>
  <version epoch="0" ver="002.003" rel="3.4"/>
  <checksum type="sha" pkgid="YES">94dff6a27e2e5e4d10116a17f24c59b9de2ac56a</checksum>
  <summary>"Proportional Mincho" Japanese TrueType font made by IPA</summary>
  <description>"Proportional Mincho" Japanese TrueType font made by IPA
(Information-technology Promotion Agency).



Authors:
--------
    Information-technology Promotion Agency, Japan.  (http://www.ipa.go.jp)</description>
  <packager>http://bugs.opensuse.org</packager>
  <url>http://www.ipa.go.jp/</url>
  <time file="1210095653" build="1208824926"/>
  <size package="3363336" installed="5866185" archive="5867272"/>
<location href="rpm/noarch/IPAPMincho-002.003-3.4.noarch.rpm"/>
  <format>
    <rpm:license>Any commercial</rpm:license>
    <rpm:vendor>SUSE LINUX Products GmbH, Nuernberg, Germany</rpm:vendor>
    <rpm:group>System/X11/Fonts</rpm:group>
    <rpm:buildhost>adams.suse.de</rpm:buildhost>
    <rpm:sourcerpm>IPAPGothic-5.0.3-16.9.src.rpm</rpm:sourcerpm>
    <rpm:header-range start="448" end="7465"/>
    <rpm:provides>
      <rpm:entry name="scalable-font-ja"/>
      <rpm:entry name="locale(ja)"/>
      <rpm:entry name="IPAPMincho" flags="EQ" epoch="0" ver="002.003" rel="3.4"/>
    </rpm:provides>
    <rpm:requires>
      <rpm:entry name="/bin/sh" pre="1"/>
    </rpm:requires>
  </format>
</package>

</metadata>


Как же получить всю запись <package> если тэг <name> у неё записан как XXX?


★★★★★

на js вот так вот можно


var fs = require("fs")

console.log(
 fs.readFileSync("tst.xml", "utf8").match(/<package[^>]*>[\s\S]+?<\/package>/g).join("\n")
)


//>>>> <package type="rpm">
//>>>>   <name>ZZZZZZ</name>
//>>>>   <arch>i586</arch>
//>>>>   <version epoch="0" ver="0.735" rel="1.10"/>
//>>>>   <checksum type="sha" pkgid="YES">0d519e1d7d455352525b40f8e21db563decc15c3</checksum>
//>>>>   <summary>A Tool to Verify the 3D Configuration</summary>
//>>>>   <description>With 3Ddiag you can verify the 3D configuration.
//>>>> 
//>>>> 
//>>>> 
//>>>> Authors:
//>>>> --------
//>>>>     Stefan Dirsch &lt;sndirsch@suse.de&gt;</description>
//>>>>   <packager>http://bugs.opensuse.org</packager>
//>>>>   <url></url>
//>>>>   <time file="1210095650" build="1208992146"/>
//>>>>   <size package="30622" installed="48531" archive="50300"/>
//>>>> <location href="rpm/i586/3ddiag-0.735-1.10.i586.rpm"/>
//>>>>   <format>
//>>>>     <rpm:license>GPL v2 or later</rpm:license>
//>>>>     <rpm:vendor>SUSE LINUX Products GmbH, Nuernberg, Germany</rpm:vendor>
//>>>>     <rpm:group>System/Base</rpm:group>
//>>>>     <rpm:buildhost>bragg.suse.de</rpm:buildhost>
//>>>>     <rpm:sourcerpm>3ddiag-0.735-1.10.src.rpm</rpm:sourcerpm>
//>>>>     <rpm:header-range start="448" end="16920"/>
//>>>>     <rpm:provides>
//>>>>       <rpm:entry name="3ddiag" flags="EQ" epoch="0" ver="0.735" rel="1.10"/>
//>>>>     </rpm:provides>
//>>>>     <rpm:requires>
//>>>>       <rpm:entry name="/bin/sh"/>
//>>>>       <rpm:entry name="libsysfs.so.1"/>
//>>>>     </rpm:requires>    <file>/usr/bin/3Ddiag.devel</file>
//>>>>     <file>/usr/bin/3Ddiag.nvidia_glx</file>
//>>>>     <file>/usr/bin/3Ddiag.ignoredb</file>
//>>>>   </format>
//>>>> </package>
//>>>> <package type="rpm">
//>>>>   <name>XXX</name>
//>>>>   <arch>noarch</arch>
//>>>>   <version epoch="0" ver="002.003" rel="3.4"/>
//>>>>   <checksum type="sha" pkgid="YES">94dff6a27e2e5e4d10116a17f24c59b9de2ac56a</checksum>
//>>>>   <summary>"Proportional Mincho" Japanese TrueType font made by IPA</summary>
//>>>>   <description>"Proportional Mincho" Japanese TrueType font made by IPA
//>>>> (Information-technology Promotion Agency).
//>>>> 
//>>>> 
//>>>> 
//>>>> Authors:
//>>>> --------
//>>>>     Information-technology Promotion Agency, Japan.  (http://www.ipa.go.jp)</description>
//>>>>   <packager>http://bugs.opensuse.org</packager>
//>>>>   <url>http://www.ipa.go.jp/</url>
//>>>>   <time file="1210095653" build="1208824926"/>
//>>>>   <size package="3363336" installed="5866185" archive="5867272"/>
//>>>> <location href="rpm/noarch/IPAPMincho-002.003-3.4.noarch.rpm"/>
//>>>>   <format>
//>>>>     <rpm:license>Any commercial</rpm:license>
//>>>>     <rpm:vendor>SUSE LINUX Products GmbH, Nuernberg, Germany</rpm:vendor>
//>>>>     <rpm:group>System/X11/Fonts</rpm:group>
//>>>>     <rpm:buildhost>adams.suse.de</rpm:buildhost>
//>>>>     <rpm:sourcerpm>IPAPGothic-5.0.3-16.9.src.rpm</rpm:sourcerpm>
//>>>>     <rpm:header-range start="448" end="7465"/>
//>>>>     <rpm:provides>
//>>>>       <rpm:entry name="scalable-font-ja"/>
//>>>>       <rpm:entry name="locale(ja)"/>
//>>>>       <rpm:entry name="IPAPMincho" flags="EQ" epoch="0" ver="002.003" rel="3.4"/>
//>>>>     </rpm:provides>
//>>>>     <rpm:requires>
//>>>>       <rpm:entry name="/bin/sh" pre="1"/>
//>>>>     </rpm:requires>
//>>>>   </format>
//>>>> </package>


newquestion
()
import xml.etree.ElementTree
print xml.etree.ElementTree.parse('test.xml').findall('*[ns:name="XXX"]',{'ns':'http://linux.duke.edu/metadata/common'})[0]
anonymous
()

Как-то так:

xmllint --xpath '//*[local-name()="package" and ./*[local-name()="name"]/text()="XXX"]'

Но вообще xmllint не очень для этого подходит.

anonymous
()
Ответ на: комментарий от anonymous

О, подходит! Спасибо! А что лучше подойдёт, чтоб гарантированно работало без дополнительных пакетов?

Mr_Alone ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ух, про Питон я и забыл. Хотя так и не заработает, но спасибо за наводку.

Mr_Alone ★★★★★
() автор топика
Ответ на: комментарий от Mr_Alone

А что лучше подойдёт, чтоб гарантированно работало без дополнительных пакетов?

Я бы сделал простенький скриптец на питоне, для работы с xml там все есть и он же в базовой поставке практически везде присутствует. Но, как правило, девопсам легче писать на баше, может и xmllint для твоей задачи будет достаточно.

anonymous
()
Ответ на: комментарий от Mr_Alone

Java. JRE можно таскать с собой, запускать только jar-файл соответствующий скриптом на Bash и не парится...

P.S.: Нет, я не шучу. Это вполне работоспособно. И иногда приходится так извращаться.

P.P.S.: Погугли xmlstartlet. Может помочь.

TheKnight ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.