23

如何让 xmllint 为“每行”属性输出 xpath 选择器的多个结果?

举个例子:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <config>
          <tagX key1="value1 " key2=" value2"/>
          <tagY key3="value3" key4=" value4 "/>
  </config>


  $ xmllint example.xml --xpath "/config/*/@*"

结果是:

   key1="value1 " key2=" value2" key3="value3" key4=" value4 "

我想得到的是:

   key1="value1 "
   key2=" value2"
   key3="value3"
   key4=" value4 "

我需要在偶数引号后拆分,还是有更简洁的方法来做到这一点?

有一个相关的问题,关于同一主题,除了它是关于挑选内容<tag>value</tag>,而不是<tag attribute="value" />

4

5 回答 5

15

你可以试试:

$ xmllint --shell inputfile <<< 'cat /config/*/@*'

但是,您可能需要grep输出,以便过滤不需要的行。

于 2013-07-31T13:37:03.733 回答
6

如果它是一个选项,请尝试使用 xmlstarlet 代替:

xmlstarlet sel -t -v "/config/*/@*" example.xml

于 2015-05-26T03:19:21.963 回答
1

这个问题很老,但是当我来到这篇文章寻找相同问题的解决方案时,这是我的解决方案

在 linux 上添加 sed 替换以拆分输出:

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g"

当然,替换表达式取决于您的 xml 结构和您的 xpath 查询。

如果添加 nl,您甚至可以在每行上添加行号

$ xmllint example.xml --xpath "/config/*/@*" | sed "s| key|\nkey|g" | nl

这使

   1 key1="value1 "
   2 key2=" value2"
   3 key3="value3"
   4 key4=" value4 "
于 2015-05-04T14:44:29.430 回答
1

如果使用最新的 xmllint,结果现在应该已经分开了\n。但是,如果字段包含\n,您可以使用此修补版本\0作为分隔符,使用--xpath0. 无论出于何种原因,PR尚未合并。

于 2018-07-30T14:37:29.987 回答
1

我发现 Ubuntu v.14 和 v.18 使用了太旧的 libxml2 版本。所以我通过重新编译libxml2 v2.9.10解决了主题中提到的问题。

1) 从http://linuxfromscratch.org/blfs/view/cvs/general/libxml2.html下载 libxml2 的源代码

2)下载测试套件:

$ wget http://www.w3.org/XML/Test/xmlts20130923.tar.gz

3) 执行:

$ tar xf libxml2-2.9.10.tar.gz

4) 执行:

$ cd libxml2-2.9.10/

5) 执行:

$ sed -i 's/test.test/#&/' python/tests/tstLastError.py

6) 执行:

$ export CPATH="/usr/include/python3.6/:$CPATH"

7) 执行:

$ sudo apt-get install -y python3-libxml2 python3-pip

8) 执行:

$ sudo pip3 install libxml2dom

9) 执行:

$ ./configure --prefix=/usr --disable-static --with-history --with-python=/usr/bin/python3 && make

在此确保返回代码 ($?) 为 0。

10) 执行:

$ tar xf ../xmlts20130923.tar.gz

11) 执行:

make check > check.log

在此确保返回代码 ($?) 为 0。

12) 执行:

$ sudo make install

享受

$ xmllint data.xml -xpath "//some_child/ancestor::some_parent/attribute::id"                                                                               
 id="1"
 id="10010"
 id="10011"
 id="10020"
 id="10021"
于 2019-11-07T11:20:06.690 回答