2013-06-06 11 views
23

मैं एक pom.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> 

मैं एक का उपयोग कर XML से artifactId और संस्करण निकालने के लिए की जरूरत है खोल कमांड मेरे पास निम्नलिखित आवश्यकताएं/टिप्पणियां हैं:

  1. शैल स्क्रिप्ट एक बिल्ड असेंबली फ़ाइल के भीतर किया जाएगा जो हम काम पर उपयोग करते हैं, इसलिए स्क्रिप्ट जितनी छोटी होगी।
  2. चूंकि इसका उपयोग कई प्रणालियों (आमतौर पर आरएचईएल 5) पर किया जाएगा, इसलिए मैं कुछ ऐसी चीज ढूंढ रहा हूं जो डिफ़ॉल्ट छवियों पर मूल रूप से चल सके।
  3. जैसे टैग पोम में कहीं और हो सकते हैं, इसलिए मैं उन टैग्स के लिए बस अजीब नहीं हो सकता। अपने Mac पर

    1. xpath काम करता है, लेकिन RHEL मशीनों पर डिफ़ॉल्ट रूप से उपलब्ध नहीं है:

    मैं निम्नलिखित की कोशिश की है। इसी प्रकार xmllint --xpath के लिए, जो मुझे लगता है केवल xmllint के बाद के संस्करणों पर उपलब्ध है, जो मेरे पास नहीं है और लागू नहीं कर सकता है।

  4. xmllint --pattern होनहार लग रहा था, लेकिन मैं xmllint --pattern '//project/parent/version' pom.xml के बाहर एक आउटपुट प्राप्त नहीं कर पा रहे या xmllint --stream --pattern '//project/parent/version' pom.xml (कोई उत्पादन) (पूरे एक्सएमएल प्रिंट)।

मुझे एहसास है कि यह SO पर एक आम प्रश्न है, लेकिन ऊपर दिए गए बिंदु इसलिए मैं उन उत्तरों का उपयोग नहीं कर सकता। आपकी मदद के लिए टीआईए।

उत्तर

14

मैं समय xmllint --shell का उपयोग कर इस बल्कि unwiedly स्क्रिप्ट के साथ होने के लिए इसे हल करने प्रबंधित किया है।

echo "cat //project/parent/version" | xmllint --shell pom.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g' 

तो एक्सएमएल नोड्स नाम स्थान विशेषताओं की तरह मेरे pom.xml था, चीजों को भारी हो, मूल रूप से नाम से नोड निकालने है:

echo "cat //*[local-name()='project']/*[local-name()='parent']/*[local-name()='version']" | xmllint --shell pom.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g' 

आशा है कि यह मदद करता है। यदि कोई भी इन अभिव्यक्तियों को आसानी से कर सकता है, तो मैं आभारी रहूंगा।

+2

वैकल्पिक रूप से, आप इसका उपयोग कर सकते हैं: 'echo "cat // * [local-name() =' project ']/* [स्थानीय-नाम() =' parent ']/* [स्थानीय-नाम() =' संस्करण ']/पाठ() "| xmllint --shell pom.xml | sed '/^\ />/d'', तो आपको केवल 'sed'-xmllint shell stuff –

+0

को हटाने की आवश्यकता है यदि आपके पास हाल ही में पर्याप्त' xmllint' है, तो आपको '--shell' सामग्री की आवश्यकता नहीं है : 'xmllint --xpath/* [स्थानीय-नाम() ==" प्रोजेक्ट "]/... 'pom.xml'। 'स्थानीय-नाम()' भाग वह था जो मैं अपनी लिपि के लिए खो रहा था। – Guss

13

--format केवल दस्तावेज़ (इंडेंट, आदि) दस्तावेज़ के लिए उपयोग किया जाता है। आपको लगता है कि --xpath का उपयोग कर (Ubuntu, libxml v20900 में परीक्षण) कर सकते हैं:

$ xmllint --xpath "//project/parent/version/text()" pom.xml 
1.5.0 
+0

कोशिश कर सकते हैं। और मैं यह मौका नहीं चाहता कि यह मेरे निर्माण प्रणालियों पर उपलब्ध होगा। –

+0

ओह क्षमा करें मैंने ध्यान नहीं दिया। पायथन/libxml2 एक विकल्प है? – Salem

+1

इसके अलावा: 'xpath -q -e" // प्रोजेक्ट/पैरेंट/संस्करण/टेक्स्ट() "pom.xml' – Salem

3

text() XPath समारोह का उपयोग करके आप तत्व मूल्य देता है बल्कि एक्सएमएल टैग हटाने के लिए की तुलना में:

echo "cat //project/parent/version/text()" | xmllint --shell pom.xml 
+0

क्षमा करें पाठ() काम नहीं करता है और न ही '/ value/text() 'libxml2 का कौन सा संस्करण आप उपयोग कर रहे हैं? मेरे पास 2.7.6 – Dejan

5

मैं यहाँ किसी वेबसाइट पर कोई मूल्य स्क्रैप करने का एक अच्छा तरीका की तलाश में आया। निम्न उदाहरण उन लोगों के लिए उपयोगी हो सकता है (पोस्टर के विपरीत) जिनके पास xmllint का संस्करण है जो --xpath का समर्थन करता है।

मुझे elasticsearch.debfile का सबसे हालिया स्थिर संस्करण खींचने और इसे स्थापित करने की आवश्यकता है। रखरखावकर्ता ने कक्षा संस्करण "संस्करण" के साथ संस्करण संख्या को एक अवधि में मददगार रूप से रखा है।

version=`curl -s http://www.elasticsearch.org/download/ |\ 
xmllint --html --xpath '//span[@class="version"]/text()'\ 
2>/dev/null - `; 

क्या पर चला जाता है:

हम कर्ल -s (मूक) विकल्प का उपयोग करें।

curl -s http://www.elasticsearch.org/download/ 

हम xmllint --html और --xpath स्विच का उपयोग करते हैं। xpath तर्कों (एकल उद्धरण में)

'//span[@class="version"]/text()' 

... वर्ग विशेषता (@class) "संस्करण" के साथ एक < अवधि > नोड के लिए लग रहा है, और पाठ मान अर्क (/ पाठ())।

चूंकि xmllint (आश्चर्य!) एक लिटर है, यह आपके एचटीएमएल स्ट्रीम में अपरिहार्य कचरा के बारे में चिल्लाएगा। हम हमेशा की तरह/dev/बातिल को stderr प्रत्यक्ष:

2>/dev/null 

अंत में, ध्यान दें "-" xmllint आदेश है, जो xmllint धारा stdin से आ रहा है बताता है के अंत में।

+2

कार्तिक है। वी, यह आपके लिए अच्छा जवाब नहीं है, लेकिन आपका प्रश्न अच्छी तरह से नामित है, इसलिए यह Google खोज में बहुत अधिक है। मैंने सोचा कि मैं इसे अपने जैसे लोगों के लिए जोड़ दूंगा जो त्वरित उत्तर की तलाश में हैं और अलग-अलग टूल हैं। – lysdexia

-1

लाइक यू मैंने कहा, `xmllint` की मेरी संस्करण` --xpath` विकल्प का समर्थन नहीं लगती

xmllint --xpath "/*[name()='project']/*[name()='groupId']/text()" pom.xml

संबंधित मुद्दे