سؤال

بشكل افتراضي، عند استدعاء elertree.parse (someXmlFile) بادئات مكتبة Python Elemertree Python كل عقدة تحليل مع مساحة الاسم URI في كلاارك:

 {http://example.org/namespace/specflynode.

هذا يجعل الوصول إلى عقد محددة عبر اسم ألم ضخم في وقت لاحق في التعليمات البرمجية.

لقد قرأت من خلال المستندات على Synertree وسماح المساحات ويبدو iterparse() يجب أن تسمح لي الوظيفة بتغيير الطريقة التي يبثها المحلل البادئة مساحات الأسماء، ولكن بالنسبة لحياة لي لا أستطيع فعلا أن أجعلها تغيير البادئة. يبدو أن هذا قد يحدث في الخلفية قبل الحدث NS-Start حتى حرائق كما هو الحال في هذا المثال:

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

كيف يمكنني تغيير سلوك البادئة وما هو الشيء المناسب للعودة عند انتهاء الوظيفة؟

هل كانت مفيدة؟

المحلول

لا تحتاج تحديدا إلى الاستخدام 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'، لا شيء) ('oth: style2'، لا شيء)

الذي يوضح كيف يمكنك الوصول إلى أسماء العلامات المؤهلة بالكامل من العقد الفردية في شجرة محددة. يجب أن تكون قادرا على تكييف ذلك لاحتياجاتك المحددة.

نصائح أخرى

XML.ETREE.ELEMENTTREE لا يبدو أن لديك Fixtag، حسنا، لا وفقا للوثائق. ومع ذلك نظرت إلى بعض التعليمات البرمجية المصدرية ل 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، ومناسبة للبحث. مساحة الاسم في مساحة الاسم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top