Frage

Standardmäßig Wenn Sie ElementTree.parse (someXMLfile) rufen den Python ElementTree Bibliothek Präfixe jeden analysierten Knoten mit seinem NamespaceURI in Clark Notation:

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

Dies macht bestimmten Knoten mit Namen später im Code einen großer Schmerz erreichbar.

Ich habe durch die Dokumentation auf ElementTree und Namensräumen lesen und es sieht aus wie die iterparse() Funktion erlauben sollte mir die Art und Weise der Parser Präfixe Namespaces zu ändern, aber für das Leben von mir kann ich nicht wirklich machen es das Präfix ändern. Es scheint so, dass im Hintergrund vor dem ns-Startereignis sogar Brände wie in diesem Beispiel passieren kann:

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

Wie mache ich es das Vorfixierung Verhalten ändern, und was ist die richtige Sache zurückzukehren, wenn die Funktion beendet?

War es hilfreich?

Lösung

Sie müssen nicht speziell iterparse verwenden. Stattdessen wird das folgende Skript:

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)

erzeugt

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

Das zeigt, wie Sie die vollständig qualifizierten Tag-Namen einzelnen Knoten in einem geparsten Baum zugreifen können. Sie sollten diese in der Lage sein, auf Ihre speziellen Bedürfnisse anzupassen.

Andere Tipps

xml.etree.ElementTree erscheint nicht fixtag zu haben, na ja, nicht gemäß der Dokumentation. Jedoch habe ich an einem gewissen Quellcode haben gesucht nach fixtag und Sie tun:

import xml.etree.ElementTree as ET

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

Sie haben den Tag-String in looktag, geeignet für eine Referenz. Der Namensraum ist im Namensraum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top