Tôi đang cố gắng để trích xuất các giá trị của một nút khỏi pom.xml:lệnh shell Native thiết lập để trích xuất giá trị nút từ XML
<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<groupId>org.me.labs</groupId>
<artifactId>my-random-project</artifactId>
<version>1.5.0</version>
</parent>
...
</project>
tôi cần phải trích xuất các artifactId và phiên bản từ XML bằng cách sử dụng lệnh shell. Tôi có các yêu cầu/quan sát sau đây:
- Kịch bản lệnh shell sẽ được thực hiện trong tệp lắp ráp chúng tôi sử dụng tại nơi làm việc, vì vậy tập lệnh càng nhỏ càng tốt.
- Vì nó sẽ được sử dụng trên nhiều hệ thống (thường là RHEL5), tôi đang tìm một thứ có thể chạy nguyên bản trên hình ảnh mặc định.
- Các thẻ giống như có thể xảy ra ở nơi khác trong pom, vì vậy tôi không thể đơn giản là awk cho các thẻ đó.
Tôi đã thử những điều sau đây:
xpath
công trình trên máy Mac của tôi, nhưng không có sẵn theo mặc định trên máy RHEL. Tương tự như vậy đối vớixmllint --xpath
, tôi đoán là chỉ khả dụng trên các phiên bản sau củaxmllint
, mà tôi không có và không thể thực thi.xmllint --pattern
có vẻ đầy hứa hẹn, nhưng dường như tôi không thể nhận được kết quả từxmllint --pattern '//project/parent/version' pom.xml
(in toàn bộ XML) hoặcxmllint --stream --pattern '//project/parent/version' pom.xml
(không có đầu ra).
Tôi nhận thấy đây là câu hỏi phổ biến ở đây trên SO, nhưng các điểm trên là lý do tôi không thể sử dụng các câu trả lời đó. TIA để được giúp đỡ.
Ngoài ra, bạn có thể sử dụng: 'echo" cat // * [local-name() = 'project']/* [tên địa phương() = 'parent']/* [local-name() = 'version ']/text() "| xmllint --shell pom.xml | sed '/^\ />/d'', vì vậy bạn chỉ cần 'sed'-remove các công cụ xmllint shell –
Nếu bạn có đủ' xmllint', thì bạn không cần công cụ '--shell' : 'xmllint --xpath/* [tên địa phương() ==" dự án "]/... 'pom.xml'. Phần 'local-name()' là những gì tôi đã bỏ lỡ cho kịch bản của mình. – Guss