2013-07-31 25 views
15

Làm thế nào tôi có thể nhận được xmllint để xuất nhiều kết quả của bộ chọn xpath cho thuộc tính "trên mỗi dòng"?Nhận xmllint để xuất kết quả xpath tách biệt, cho bộ chọn thuộc tính

Hãy ví dụ này:

<?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/*/@*" 

Kết quả là:

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

Những gì tôi muốn nhận được là:

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

Liệu tôi có cần phải chia sau even- đánh dấu trích dẫn số, hoặc là có cách nào để làm điều này?

Có một câu hỏi liên quan, about the same subject trừ đó là về chọn ra nội dung của <tag>value</tag>, và không <tag attribute="value" />

+0

Điều này có giúp ích cho 'echo' cat/config/*/@ * [bắt đầu bằng (name(), "key")] '| xmllint --shell input.xml' – devnull

+0

@devnull: '| grep = 'và nó ổn. (trên thực tế, không có '[bắt đầu bằng() ...' chỉ '/ @ *' Tôi đã sử dụng "key1, key2 ..." làm các biến siêu thực, tên thuộc tính thực tế sẽ là tùy ý.) –

+0

Có, 'grep - v' và xong! – devnull

Trả lời

11

Bạn có thể thử:

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

Bạn có thể cần phải grep đầu ra, tuy nhiên, để lọc các dòng không mong muốn.

+2

Chuyển hướng tài liệu ở đây là lạ, sẽ đủ để nói '<<< 'cat/config/*/@ *'' – Guss

1

Câu hỏi đặt ra là cũ nhưng khi tôi đến bài này tìm kiếm một giải pháp cho cùng một vấn đề, đây là giải pháp của tôi

Trên Linux thêm thay sed chia ra:

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

của khóa học biểu thức thay thế phụ thuộc vào cấu trúc xml của bạn và truy vấn xpath của bạn.

Và thậm chí bạn có thể thêm số dòng trên mỗi dòng nếu bạn thêm nl

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

Mà cho

1 key1="value1 " 
    2 key2=" value2" 
    3 key3="value3" 
    4 key4=" value4 " 
+1

Vấn đề là nó phụ thuộc vào lược đồ đặt tên nhất quán của các khóa (thuộc tính) Nếu họ không phải là 'key1, key2' nhưng 'name, birthdate', điều này sẽ không hoạt động. –

2

Nếu đó là một lựa chọn, hãy thử sử dụng xmlstarlet thay vì:

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

Các vấn đề liên quan