2015-02-12 7 views
5

अनदेखी करने के लिए मैं xmllint --xpath का उपयोग कर एक्सएमएल फ़ाइलें (Maven poms) की एक बड़ी संख्या संसाधित करने का प्रयास कर रहा हूँ। कुछ परीक्षण और त्रुटि के साथ मैं पता लगा यह अपेक्षा के अनुरूप काम नहीं कर रहा है कि इन फ़ाइलों में बुरा डिफ़ॉल्ट नाम स्थान घोषणा है, जो इस प्रकार है की वजह से:फोर्स xmllint बुरा defult xmlns

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

एक साधारण आदेश इस प्रकार है विफल रहता है:

$ echo $(xmllint --xpath '/project/modelVersion/text()' pom.xml) 
XPath set is empty 

मैं xmlns विशेषता से छुटकारा पाने के लिए, इस प्रकार मूल तत्व की जगह:

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

पिछला आदेश अपेक्षित आउटपुट देता है:

+०१२३५१६४१०
$ echo $(xmllint --xpath '/project/modelVersion/text()' pom.xml) 
4.0.0 

सैकड़ों पोम फ़ाइलों को बदलना एक विकल्प नहीं है, खासकर जब से मैवेन स्वयं शिकायत नहीं करता है।

xmllint के लिए खराब xmlns के साथ फ़ाइल को संसाधित करने का कोई तरीका है?

अद्यतन

डेमियन के लिए धन्यवाद मैं कुछ प्रगति करने में सक्षम था:

$ (echo setns x=http://maven.apache.org/POM/4.0.0; echo 'xpath /x:project/x:modelVersion/text()';) | xmllint --shell pom.xml 
/> setns x=http://maven.apache.org/POM/4.0.0 
/> xpath /x:project/x:modelVersion/text() 
Object is a Node Set : 
Set contains 1 nodes: 
1 TEXT 
    content=4.0.0 

लेकिन यह काफी है कि मैं क्या जरूरत नहीं करता है। मेरे अनुवर्ती प्रश्न निम्नानुसार हैं:

  1. क्या केवल पाठ मुद्रित करने का कोई तरीका है? मैं आउटपुट को उपरोक्त उदाहरण पर उपरोक्त उदाहरण

  2. ऐसा लगता है कि उत्पादन लगभग 30 वर्णों के बाद छोटा हो जाता है। क्या पूरा आउटपुट प्राप्त करना संभव है? इस के साथ एसईडी

    pom.xml में दी गई साथ xmllint --xpath

+0

यह एक * बुरा * नाम स्थान नहीं है। यह एक नामस्थान है।आमतौर पर इसका अर्थ यह है कि आपको अपने XPath क्वेरी में नेमस्पेस का उपयोग करने की भी आवश्यकता है, लेकिन मैं आपको बताए जाने वाले टूल के विनिर्देशों से परिचित नहीं हूं। –

+0

यह खराब है क्योंकि यह xmllint विफल होने का कारण बनता है :) इसके अलावा क्योंकि schmealocation गलत है। –

+1

'xmllint नेमस्पेस' पर थोड़ा सा सरल खोज [इस सवाल] [http://stackoverflow.com/questions/8264134/xmllint-failing-to-properly-query-with-xpath) जो दो संभव दिखाना प्रतीत होता है * नामस्थान के साथ * काम करने के तरीके। और schemalocation सही प्रतीत होता है। यह कहता है कि यूआरआई 'http: // maven.apache.org/POM/4.0.0' द्वारा पहचाना गया स्कीमा यूआरएल' http: // maven.apache.org/maven-v4_0_0.xsd' पर स्थित हो सकता है और यह सच प्रतीत होता है। –

उत्तर

5

पट्टी नाम स्थान नहीं होता है:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
</project> 

इस:

cat pom.xml | sed '2 s/xmlns=".*"//g' | xmllint --xpath '/project/modelVersion' - 

रिटर्न इस:

<modelVersion>4.0.0</modelVersion> 

अगर आप फैशनेबल स्वरूपण है (जैसे, xmlns विशेषताओं को अपने स्वयं के तर्ज पर कर रहे हैं), यह पहली फ़ॉर्मेटर के माध्यम से चलाने:

cat pom.xml | xmllint --format - | sed '2 s/xmlns=".*"//g' | xmllint --xpath '/project/modelVersion' - 
+0

धन्यवाद, बस यह देखा। मेरे पास xmlns विशेषताएँ कई लाइनों पर फैली हुई हैं, '--format' इसके लिए एक अच्छा समाधान हो सकता है –

1
xmllint --xpath "/*[local-name() = 'project']/*[local-name() = 'parent']/*[local-name() = 'version']/text()" pom.xml 

यह असली सुंदर नहीं है, लेकिन यह स्वरूपण से बचने धारणाएं और/या इनपुट pom.xml फ़ाइल को फिर से स्वरूपित करना।

यदि आपको किसी कारण से "-स्नैपशॉट" को बंद करने की आवश्यकता है, तो ऊपर के परिणाम को | sed -e "s|-SNAPSHOT||" के माध्यम से पाइप करें।

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