2015-04-01 9 views
9

Ho un file XML da un client che ha più di > e meno di < e non riesce a controllare il formato XML. C'è un modo per aggirare questo senza chiedere al cliente di correggere il file?C'è un modo per includere più o meno di segni in un file XML?

ad es.

<?xml version="1.0" encoding="UTF-8"?> 

<note Name="PrintPgmInfo <> VDD"> 
<to>Tove</to> 
<from>Jani</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 
+0

Se non si desidera chiedere al client di correggere il file, la soluzione più ovvia è quella di risolvere il problema da soli. Se è una cosa una tantum, modificalo e sostituisci i caratteri riservati con i riferimenti di entità predefiniti; se questo accadrà ripetutamente, scrivi una sceneggiatura sed o l'equivalente nel tuo editor batch di scelta per apportare la modifica. (Se non si dispone di un editor batch di scelta e si affrontano problemi come questo, è necessario conoscere i redattori batch e ottenere risultati positivi in ​​uno.) –

risposta

3

Si dovrà utilizzare caratteri di escape XML:

" to &quot; 
' to &apos; 
< to &lt; 
> to &gt; 
& to &amp; 

Google in fuga caratteri in XML per ulteriori informazioni.

1

La risposta diretta alla sua domanda:

C'è un modo per aggirare questo senza chiedere al cliente di correggere il file?

è "no". I dati che stai ricevendo non sono XML validi e hai ragione nel rifiutarli. Consiglio vivamente di tornare al cliente e di dire che devono fornire un XML valido, usando i riferimenti delle entità di caratteri menzionati da David e Rahul.

0

Per rispondere alla tua domanda chiaramente no, non è possibile avere un file XML con < o > in uno qualsiasi dei suoi campi di valore perché il formato XML utilizza questi caratteri per indicare gli elementi principali e secondari, per esempio <note>, <to>, <from>, ecc

Ampliando la mia risposta: Quando uno script Python scrive < o > utilizzando il XML library, la biblioteca li traduce rispettivamente &lt o &gt,. Non credo che questo sia possibile con quella libreria poiché in realtà sta filtrando i caratteri < e così come i riferimenti alle entità dei caratteri. Questo ha senso: la libreria XML ti impedisce di interrompere la sintassi utilizzata per il genitore xml.etree.cElementTree.Element o qualsiasi campo secondario di oggetti xml.etree.cElementTree.SubElement. Ad esempio, utilizzare il blocco di codice in questo great answer di sperimentare:

import xml.etree.cElementTree as ET 

root = ET.Element("root") 
doc = ET.SubElement(root, "doc") 

ET.SubElement(doc, "field1", name="blah").text = "some <value>" 
ET.SubElement(doc, "field2", name="asdfasd").text = "some <other value>" 

tree = ET.ElementTree(root) 
tree.write("filename.xml") 

Questo produce <root><doc><field1 name="blah">some &lt;value&gt;</field1><field2 name="asdfasd">some &lt;other value&gt;</field2></doc></root>.

prettifying esso:

<root> 
    <doc> 
     <field1 name="blah"> 
      some &lt;value&gt; 
     </field1> 
     <field2 name="asdfasd"> 
      some &lt;other value&gt; 
     </field2> 
    </doc> 
</root> 

Tuttavia, non c'è nulla ti impedisce di aggiungere questi personaggi manualmente: leggere nel file XML e ri-scrivere, l'aggiunta di testo, anche se contiene < o > . Se si desidera un file XML corretto, accertarsi che questi caratteri vengano utilizzati solo nei campi dei commenti.

per il vostro problema particolare si poteva leggere nelle linee da file XML del cliente, quindi rimuovere le < e > personaggi o, se il cliente lo richiede, spostarli in una parte commentata della linea. Parte della sfida è che devi andare nelle porzioni <note>, `, ecc. Del file ... Questo è impegnativo ma sarebbe possibile!

Quanto segue è quello che mi aspetto che il risultato sia simile.

<?xml version="1.0" encoding="UTF-8"?> 

<note Name="PrintPgmInfo VDD"> <!-- PrintPgmInfo <> VDD --> 
<to>Tove</to> 
<from>Jani</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 
Problemi correlati