2012-01-24 2 views
30

का उपयोग कर एक्सएमएल फाइलों को सहेजना मैं एक्सएमएल फाइलों को पढ़ने के लिए सरल पायथन (3.2) कोड विकसित करने की कोशिश कर रहा हूं, कुछ सुधार करें और उन्हें वापस स्टोर करें। हालांकि, स्टोरेज चरण के दौरान एलिमेंट ट्री इस नामस्थान नामकरण को जोड़ता है। उदाहरण के लिए:एलिमेंटट्री

<ns0:trk> 
    <ns0:name>ACTIVE LOG</ns0:name> 
<ns0:trkseg> 
<ns0:trkpt lat="38.5" lon="-120.2"> 
    <ns0:ele>6.385864</ns0:ele> 
    <ns0:time>2011-12-10T17:46:30Z</ns0:time> 
</ns0:trkpt> 
<ns0:trkpt lat="40.7" lon="-120.95"> 
    <ns0:ele>5.905273</ns0:ele> 
    <ns0:time>2011-12-10T17:46:51Z</ns0:time> 
</ns0:trkpt> 
<ns0:trkpt lat="43.252" lon="-126.453"> 
    <ns0:ele>7.347168</ns0:ele> 
    <ns0:time>2011-12-10T17:52:28Z</ns0:time> 
</ns0:trkpt> 
</ns0:trkseg> 
</ns0:trk> 

कोड स्निपेट के नीचे है:

def parse_gpx_data(gpxdata, tzname=None, npoints=None, filter_window=None, 
        output_file_name=None): 
     ET = load_xml_library(); 

    def find_trksegs_or_route(etree, ns): 
     trksegs=etree.findall('.//'+ns+'trkseg') 
     if trksegs: 
      return trksegs, "trkpt" 
     else: # try to display route if track is missing 
      rte=etree.findall('.//'+ns+'rte') 
      return rte, "rtept" 

    # try GPX10 namespace first 
    try: 
     element = ET.XML(gpxdata) 
    except ET.ParseError as v: 
     row, column = v.position 
     print ("error on row %d, column %d:%d" % row, column, v) 

    print ("%s" % ET.tostring(element)) 
    trksegs,pttag=find_trksegs_or_route(element, GPX10) 
    NS=GPX10 
    if not trksegs: # try GPX11 namespace otherwise 
     trksegs,pttag=find_trksegs_or_route(element, GPX11) 
     NS=GPX11 
    if not trksegs: # try without any namespace 
     trksegs,pttag=find_trksegs_or_route(element, "") 
     NS="" 

    # Store the results if requested 
    if output_file_name: 
     ET.register_namespace('', GPX11) 
     ET.register_namespace('', GPX10) 
     ET.ElementTree(element).write(output_file_name, xml_declaration=True) 

    return; 

मैं register_namespace उपयोग करने की कोशिश की है, लेकिन कोई सकारात्मक परिणाम के साथ। क्या ElementTree 1.3 के इस संस्करण के लिए कोई विशिष्ट बदलाव हैं?

+0

मुझे बताओ अगर मैं समझ अपने प्रश्न, आप ' 'के बजाय' 'चाहते हैं और इसी तरह? –

+0

सही। मैं के बजाय रखना चाहता हूं और इसी तरह। – ilya1725

+0

यह वास्तविक समाधान नहीं है, लेकिन ऐसा लगता है कि आप एक स्ट्रिंग लोड करते हैं, क्या आपने कुछ regexp के साथ नेमस्पेस को हटाने का प्रयास किया है? उसके बाद यदि आप सबकुछ बिना लोड और सहेजते हैं तो ठीक होना चाहिए। –

उत्तर

55

ns0 से बचने के लिए डिफ़ॉल्ट नामस्थान एक्सएमएल डेटा पढ़ने से पहले सेट किया जाना चाहिए।

ET.register_namespace('', "http://www.topografix.com/GPX/1/1") 
ET.register_namespace('', "http://www.topografix.com/GPX/1/0") 
+0

पहले जैसा नहीं लगता है। मैं एक्सएमएल फ़ाइल को पढ़ने और नामस्थान प्राप्त करने में सक्षम हूं और केवल उस सेट के बाद register_namespace। पेड़ = ET.parse (एसटीआर (udx_path)) जड़ = tree.getroot() एनएस = {मूल तत्व 'udx' की # निकालने नाम स्थान: root.tag [1: root.tag.index (' } ')] } ET.register_namespace (' ', root.tag [1: root.tag.index ('} ')]) – likern

0

ऐसा लगता है कि आप अपने नाम स्थान घोषित करने के लिए है, जिसका अर्थ है कि आप से अपने xml की पहली पंक्ति को बदलने की जरूरत: की तरह कुछ करने के लिए

<ns0:trk> 

:

<ns0:trk xmlns:ns0="uri:"> 

एक बार है कि तुमने किया था अब ParseError: for unbound prefix: ... मिल जाएगा, और:

elem.tag = elem.tag[(len('{uri:}'):] 

namesp निकाल देंगे इक्का।

+0

हाय रिक। उदाहरण एक्सएमएल मैंने दिखाया _output_ है। इनपुट एक्सएमएल, जो ठीक से पार्स करता है, में 'ns0:' उपसर्ग नहीं है। यह सिर्फ मानक जीपीएक्स कोड है। – ilya1725

+0

यदि लाइन 'element = ET.XML (gpxdata) 'आपको' ns0' के साथ एक तत्व देता है तो "समस्या" gpxdata में है, इस स्थिति में आपको विकल्प चुनना होगा: gpxdata को "ठीक करें" या मानक क्यों पता लगाएं पार्सर ऐसा करता है और ['ET.XML'] (http://docs.python.org/py3k/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML) के लिए एक नया निर्माण करता है। –

+0

मूल gpxdata में कोई 'ns0' प्रविष्टियां नहीं हैं। हालांकि, आपका संकेत, रिक, मुझे समाधान के लिए नेतृत्व करते हैं। असल में, 'ET.register_namespace ('', GPX11)' 'ET.register_namespace ('', GPX10)' पढ़ने से पहले किया जाना चाहिए, यानी 'ET.XML'। – ilya1725

1

इस उत्तर ने वास्तव में मुझे ns0 मुद्दे से बचने में मदद की। मैं एम एल को GPaws से GPX (जब यह काम करता है) (गूगल के नक्शे के लिए) परिवर्तित कर रहा हूँ और मेरी कोड काम नहीं कर रहा था जब तक मैं इस ET.register_namespace(""," http://www.opengis.net/kml/2.2 ")

6

आप अपने सभी नामस्थान रजिस्टर करने की आवश्यकता की तरह डिफ़ॉल्ट नाम स्थान निर्धारित किया है।

उदाहरण के लिए: आप इस

<Capabilities xmlns="http://www.opengis.net/wmts/1.0" 
    xmlns:ows="http://www.opengis.net/ows/1.1" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:gml="http://www.opengis.net/gml" 
    xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" 
    version="1.0.0"> 

की तरह अपने इनपुट एक्सएमएल है तो आप सभी नामस्थान यानी पंजीकरण कराना होगा xmlns इस तरह के साथ मौजूद गुण:

ET.register_namespace('', "http://www.opengis.net/wmts/1.0") 
ET.register_namespace('ows', "http://www.opengis.net/ows/1.1") 
ET.register_namespace('xlink', "http://www.w3.org/1999/xlink") 
ET.register_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance") 
ET.register_namespace('gml', "http://www.opengis.net/gml")