2009-08-08 15 views
18

डिफ़ॉल्ट रूप से, जब आप ElementTree.parse (someXMLfile) कहते हैं इसके साथ हर पार्स नोड नाम स्थान यूआरआई है पायथन ElementTree पुस्तकालय उपसर्गों क्लार्क नोटेशन में ElementTree साथ लगाकर:ऑल्टर नाम स्थान अजगर

 
    {http://example.org/namespace/spec}mynode 

इस विशिष्ट नोड्स तक पहुँचने बनाता है बाद में कोड में एक बड़ा दर्द नाम से।

मैंने एलिमेंटट्री और नेमस्पेस पर दस्तावेज़ों के माध्यम से पढ़ा है और ऐसा लगता है कि iterparse() फ़ंक्शन मुझे पार्सर उपसर्गों के नामों को बदलने की अनुमति दे सकता है, लेकिन मेरे जीवन के लिए मैं वास्तव में इसे उपसर्ग नहीं बदल सकता । ऐसा लगता है कि कि एनएस शुरू घटना से पहले पृष्ठभूमि में हो सकता है यहां तक ​​कि इस उदाहरण में आग:

for event, elem in iterparse(source): 
    if event == "start-ns": 
     namespaces.append(elem) 
    elif event == "end-ns": 
     namespaces.pop() 
    else: 
     ... 

मैं कैसे करूँ यह लगाकर व्यवहार को बदलने बनाने के लिए और जब समारोह समाप्त होता है वापस जाने के लिए उचित बात क्या है ?

+1

दिलचस्प। मुझे भी जानना अच्छा लगेगा। जिस तरह से मैं आगे बढ़ता हूं वह "स्थिर" एक्सएचटीएमएल_एनएस = '{http://www.w3.org/1999/xhtml}' बनाकर और फिर कोड XHTML_NS + "mynode" – karlcow

+0

में उपयोग करके है, क्या आप समझा सकते हैं कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं ? क्लार्क का नोटेशन एक बड़ा दर्द क्यों है? –

+0

मैं मौजूदा कोड के साथ एकीकृत करने की कोशिश कर रहा हूं जो '{http://a9.com/-/spec/opensearchrss/1.0/}' की बजाय उनके मूल उपसर्ग (यानी 'ओपन सर्च') द्वारा चीजों तक पहुंचता है और मैं उम्मीद कर रहा था @karlcow का उल्लेख है कि उपसर्ग मानचित्र के प्रकार के निर्माण से एक अच्छा तरीका था। –

उत्तर

6

आपको विशेष रूप से iterparse का उपयोग करने की आवश्यकता नहीं है। इसके बजाय, निम्न स्क्रिप्ट:

from cStringIO import StringIO 
import xml.etree.ElementTree as ET 

NS_MAP = { 
    'http://www.red-dove.com/ns/abc' : 'rdc', 
    'http://www.adobe.com/2006/mxml' : 'mx', 
    'http://www.red-dove.com/ns/def' : 'oth', 
} 

DATA = '''<?xml version="1.0" encoding="utf-8"?> 
<rdc:container xmlns:mx="http://www.adobe.com/2006/mxml" 
       xmlns:rdc="http://www.red-dove.com/ns/abc" 
       xmlns:oth="http://www.red-dove.com/ns/def"> 
    <mx:Style> 
    <oth:style1/> 
    </mx:Style> 
    <mx:Style> 
    <oth:style2/> 
    </mx:Style> 
    <mx:Style> 
    <oth:style3/> 
    </mx:Style> 
</rdc:container>''' 

tree = ET.parse(StringIO(DATA)) 
some_node = tree.getroot().getchildren()[1] 
print ET.fixtag(some_node.tag, NS_MAP) 
some_node = some_node.getchildren()[0] 
print ET.fixtag(some_node.tag, NS_MAP) 

से पता चलता कौन कैसे आप एक पार्स पेड़ में अलग-अलग नोड्स के पूरी तरह से योग्य टैग नाम का उपयोग कर सकते

 
('mx:Style', None) 
('oth:style2', None) 

पैदा करता है। आपको इसे अपनी विशिष्ट जरूरतों के अनुरूप अनुकूलित करने में सक्षम होना चाहिए।

2

xml.etree.ElementTree में प्रक्षेपण के अनुसार नहीं, ठीक है, ठीक नहीं है। हालांकि मैं fixtag के लिए कुछ स्रोत कोड को देखा है और आप करते हैं:

import xml.etree.ElementTree as ET 

for event, elem in ET.iterparse(inFile, events=("start", "end")): 
    namespace, looktag = string.split(elem.tag[1:], "}", 1) 

आप looktag में टैग स्ट्रिंग, एक देखने के लिए उपयुक्त है। नामस्थान नामस्थान में है।

+3

मेरे पायथन 2.6.5 में, xml.etree.ElementTree में एक फिक्स्टाग फ़ंक्शन है, लेकिन xml.etree.cElementTree नहीं है। –

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