Domanda

Sto usando ElementTree di analizzare un file XML. In alcuni campi, ci saranno dati HTML. Ad esempio, si consideri una dichiarazione nel modo seguente:

<Course>
    <Description>Line 1<br />Line 2</Description>
</Course>

Ora, supponendo _course è una variabile elemento che detengono questo elemento Couse. Voglio accedere descrizione di questo corso, così faccio:

desc = _course.find("Description").text;

Ma poi disc contiene solo "Linea 1". Ho letto qualcosa circa l'attributo .tail, così ho provato anche:

desc = _course.find("Description").tail;

E ho la stessa uscita. Cosa devo fare per rendere disc essere "Linea 1
Linea 2" (o letteralmente nulla tra e)? In altre parole, sto cercando qualcosa di simile alla proprietà .innerText in C # (e molte altre lingue suppongo).

È stato utile?

Soluzione

Avete qualche controllo sulla creazione del file XML? Il contenuto di tag XML che contengono tag XML (o simili), o caratteri di marcatura ( '<', ecc) che devono essere codificati per evitare questo problema. È possibile farlo sia con:

  • CDATA sezione
  • Base64 o qualche altra codifica (che non include caratteri riservati XML)
  • Codifica entità ( '<' == '&lt;')

Se non è possibile apportare queste modifiche, e ElementTree Non si può ignorare i tag non incluse nello schema XML, allora si dovrà pre-processo il file. Naturalmente, sei fuori di fortuna se lo schema si sovrappone html.

Altri suggerimenti

Si sta cercando di leggere l'attributo di coda dall'elemento sbagliata. Prova

desc = _course.find("br").tail;

L'attributo di coda viene utilizzata per memorizzare finali nodi di testo durante la lettura di file XML misto di contenuti; testo che segue direttamente dopo un elemento sono memorizzati nella coda attributo per l'elemento:

    <tag><elem>this goes into elem's
    text attribute</elem>this goes into
    elem's tail attribute</tag>

codice semplice frammento di stampare il testo e la coda attributi da tutti gli elementi di XML / XHTML.

import xml.etree.ElementTree as ET

def processElem(elem):
    if elem.text is not None:
        print elem.text
    for child in elem:
        processElem(child)
        if child.tail is not None:
            print child.tail

xml = '''<Course>
    <Description>Line 1<br />Line 2 <span>child text </span>child tail</Description>
    </Course>'''

root = ET.fromstring(xml)
processElem(root)

Output:

Line 1
Line 2 
child text 
child tail

http://code.activestate.com/recipes/498286- elementtree-text-helper / per una soluzione migliore. Può essere modificato per adattarsi.

P.S. Ho cambiato il mio nome da user839338 come citato nel prossimo post

Personaggi come "<" e "&" sono illegali in elementi XML.

"<" genererà un errore perché il parser lo interpreta come l'inizio di un nuovo elemento.

"&" genererà un errore perché il parser lo interpreta come l'inizio di un'entità carattere.

Alcuni di testo, come il codice JavaScript, contiene un sacco di "<" o caratteri "&". Per evitare il codice errori di script può essere definito come CDATA.

Tutto ciò all'interno di una sezione CDATA viene ignorato dal parser.

Una sezione CDATA inizia con "":

Più informazioni su: http://www.w3schools.com/xmL/xml_cdata.asp

Spero che questo aiuti!

di user839338 risposta , ho wen't e guardai per una soluzione ragionevole, che sembra un po 'come questo.

>>> from xml.etree import ElementTree as etree
>>> corpus = '''<Course>
...     <Description>Line 1<br />Line 2</Description>
... </Course>'''
>>> 
>>> doc = etree.fromstring(corpus)
>>> desc = doc.find("Description")
>>> desc.tag = 'html'
>>> etree.tostring(desc)
'<html>Line 1<br/>Line 2</html>\n'
>>> 

Non c'è modo semplice per eliminare il tag circostante (originariamente <Description>), ma è facilmente modificato in qualcosa che potrebbe essere utilizzato come necessario, per esempio <div> o <span>

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