2015-12-04 6 views
5

मैं XML फ़ाइल में नेमस्पेस को अनदेखा करने के लिए ElementTree को कैसे बता सकता हूं?पायथन: xml.etree.ElementTree में नेमस्पेस को अनदेखा कर रहे हैं?

उदाहरण के लिए, मैं modelVersion (बयान 1 के रूप में) क्वेरी करने के लिए के बजाय {http://maven.apache.org/POM/4.0.0}modelVersion (बयान 2 के रूप में) पसंद करेंगे।

pom=""" 
<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> 
""" 

from xml.etree import ElementTree 
ElementTree.register_namespace("","http://maven.apache.org/POM/4.0.0") 
root = ElementTree.fromstring(pom) 

print 1,root.findall('modelVersion') 
print 2,root.findall('{http://maven.apache.org/POM/4.0.0}modelVersion') 

1 [] 
2 [<Element '{http://maven.apache.org/POM/4.0.0}modelVersion' at 0x1006bff10>] 
+1

AFAIK डी के लिए एक आसान + साफ तरीका नहीं है ओ तो, विशेष रूप से यदि आप संभावित रूप से एकाधिक नामस्थानों से निपट रहे हैं। ऐसा लगता है कि एक डुप्लिकेट प्रश्न [यहां] (http://stackoverflow.com/q/13412496/20670) है, लेकिन यदि आप कहते हैं कि वे दृष्टिकोण आपके लिए काम नहीं करेंगे (वे दयालु हैं मुझे गंदे हैक की तरह लग रहा है)। –

+0

इसके अलावा, ['lxml' की तलाश में लायक हो सकता है] (http://stackoverflow.com/q/14853243/20670), लेकिन यह मानक लाइब्रेरी का हिस्सा नहीं है। –

+1

दुख की बात है कि मैं इसे किसी ऐसे व्यक्ति को भेज रहा हूं जो lxml इंस्टॉल नहीं कर सकता है। मुझे उम्मीद है कि मानक पुस्तकालय इसे कुछ दिन शामिल करता है। मैंने अपना वर्तमान समाधान पोस्ट किया जो मुझे बहुत दुखी बनाता है एक बार मैंने अपनी माँ से कहा कि मैं एक पेशेवर प्रोग्रामर था। : -/ –

उत्तर

0

, कोई सीधी-सपाट मार्ग होने के लिए वहाँ दिखाई देता है इस प्रकार मैं बस खोजने के कॉल करता है, उदा लपेट था

from xml.etree import ElementTree as ET 

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

NSPS = {'foo' : "http://maven.apache.org/POM/4.0.0"} 

# sic! 
def findall(node, tag): 
    return node.findall('foo:' + tag, NSPS) 

root = ET.fromstring(POM) 
print(map(ET.tostring, findall(root, 'modelVersion'))) 

उत्पादन:

['<ns0:modelVersion xmlns:ns0="http://maven.apache.org/POM/4.0.0">4.0.0</ns0:modelVersion>\n'] 
0

यहाँ मैं वर्तमान में क्या कर रहा है, जो मुझे अविश्वसनीय रूप से विश्वास है एक बेहतर तरीका है कि वहाँ बनाता है।

$ cat pom.xml | 
    tr '\n' ' ' | 
    sed 's/<project [^>]*>/<project>/' | 
    myprogram | 
    sed 's/<project>/<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">/' 
+0

इसे पाइप में seding करने के बजाय, आप python स्क्रिप्ट में xml स्ट्रिंग पैच कर सकते हैं या एक डमी नेमस्पेस और एक रैपर फ़ंक्शन (pls। C मेरा उत्तर नीचे) –

+0

मुझे इसे पाइप कोज़ में ठीक करना पसंद है तो मेरा वास्तविक कार्यक्रम साफ है। अगर मैं भविष्य में एक बेहतर एक्सएमएल पैकेज पर स्विच कर सकता हूं तो मैं केवल सामग्री को रैपर में छोड़ने में सक्षम हूं। –

+0

अच्छा - अगर आप पहले से ही अपने पाइप से बहुत खुश हैं - तो हम वास्तव में किस बारे में बात कर रहे हैं :)? –

0

उपेक्षा के बजाय, एक और दृष्टिकोण पेड़ में नामस्थान दूर करने के लिए होगा, इसलिए 'उपेक्षा' करने के लिए, क्योंकि वे वहां नहीं हैं कोई आवश्यकता नहीं है - इस सवाल का nonagon के जवाब (और उस के अपने विस्तार को देखने के विशेषताओं पर नामस्थान शामिल करने के लिए): Python ElementTree module: How to ignore the namespace of XML files to locate matching element when using the method "find", "findall"

0

शैल का उपयोग किये बिना समकक्ष समाधान यहां दिया गया है। मूल विचार:

  • का अनुवाद <project junk...><project> को
  • प्रदर्शन "क्लीन" प्रसंस्करण नाम स्थान के बारे में चिंता किए बिना
  • नए कोड के साथ <project junk...>

को वापस <project> का अनुवाद:

pom=""" 
<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> 
""" 
short_project="""<project>""" 
long_project="""<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">""" 

import re,sys 
from xml.etree import ElementTree 

# eliminate namespace specs 
pom=re.compile('<project [^>]*>').sub(short_project,pom) 

root = ElementTree.fromstring(pom) 
ElementTree.dump(root) 
print 1,root.findall('modelVersion') 
print 2,root.findall('{http://maven.apache.org/POM/4.0.0}modelVersion') 
mv=root.findall('modelVersion') 

# restore the namespace specs 
pom=ElementTree.tostring(root) 
pom=re.compile(short_project).sub(long_project,pom) 
संबंधित मुद्दे