Domanda

Per impostazione predefinita, quando si chiama ElementTree.parse (someXMLfile) i prefissi libreria Python elementtree ogni nodo analizzato con esso di namespace URI in notazione di Clark:

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

In questo modo l'accesso ai nodi specifici per nome un dolore enorme più avanti nel codice.

Ho letto attraverso i documenti sul ElementTree e spazi dei nomi e sembra che la funzione iterparse() dovrebbe permettermi di modificare il modo in cui il parser prefissi spazi dei nomi, ma per la vita di me non posso effettivamente fare modificare il prefisso. Sembra che possono accadere in background prima che l'evento ns-start anche incendi come in questo esempio:

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

Come faccio a farlo modificare il comportamento prefisso di e qual è la cosa giusta per tornare quando la funzione termina?

È stato utile?

Soluzione

Non è specificamente necessario utilizzare iterparse. Al contrario, il seguente script:

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)

produce

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

che mostra come è possibile accedere ai nomi dei tag completo del singoli nodi in un albero analizzata. Si dovrebbe essere in grado di adattare questo alle vostre specifiche esigenze.

Altri suggerimenti

xml.etree.ElementTree non sembra avere fixtag, beh, non in base alla documentazione. Tuttavia Ho guardato un po 'di codice sorgente per fixtag e fate:

import xml.etree.ElementTree as ET

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

Hai la stringa tag nel looktag, adatto per una ricerca. Lo spazio dei nomi è in namespace.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top