2015-04-01 9 views
9

Ich habe eine XML-Datei von einem Client, der mehr als > und weniger als < Zeichen enthält und es eine XML-Formatprüfung fehlschlägt. Gibt es eine Möglichkeit, dies zu umgehen, ohne den Client zu bitten, die Datei zu reparieren?Gibt es eine Möglichkeit, mehr als oder weniger als Schilder in eine XML-Datei aufzunehmen?

z.B.

<?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

Wenn Sie den Client nicht bitten möchten, die Datei zu reparieren, liegt die offensichtliche Lösung darin, dass Sie die Datei selbst reparieren. Wenn es sich um eine einmalige Sache handelt, bearbeiten Sie sie und ersetzen Sie die reservierten Zeichen durch die vordefinierten Entity-Referenzen. Wenn dies wiederholt auftritt, schreiben Sie ein sed-Skript oder das Äquivalent in Ihren Batch-Editor Ihrer Wahl, um die Änderung vorzunehmen. (Wenn Sie keinen Batch-Editor Ihrer Wahl haben und Probleme mit diesem Problem auftreten, sollten Sie sich mit den Batch-Editoren vertraut machen und bei eins gut werden.) –

Antwort

3

Sie XML-Escape-Zeichen verwenden:

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

Google Flucht Zeichen in XML für weitere Informationen.

1

Die direkte Antwort auf Ihre Frage:

Gibt es eine Möglichkeit, dies zu umgehen, ohne den Client zu fragen, die Datei zu reparieren?

ist "Nein". Die Daten, die Sie erhalten, sind keine gültigen XML-Daten, und Sie haben sie korrekt abgelehnt. Ich empfehle dringend, zurück zum Client zu gehen und zu sagen, dass sie gültiges XML bereitstellen müssen, indem sie Zeichen-Entity-Referenzen verwenden, wie von David und Rahul erwähnt.

0

Um Ihre Frage klar keine zu beantworten, können Sie nicht eine XML-Datei mit < oder > in einem seiner Wertfelder haben, da das XML-Format diese Zeichen verwendet die Eltern-Kind-Elemente zu bezeichnen, z.B. <note>, <to>, <from> usw.

Erweiterung auf meine Antwort: Wenn ein Python-Skript < oder > die XML library Verwendung schreibt, übersetzt die Bibliothek sie &lt oder &gt sind. Ich glaube nicht, dass dies mit dieser Bibliothek möglich ist, da es tatsächlich die < und > Zeichen sowie die Character Entity References ausfiltert. Dies ist sinnvoll - die XML-Bibliothek verhindert, dass Sie die Syntax für die übergeordneten Objektfelder xml.etree.cElementTree.Element oder ein beliebiges untergeordnetes Objekt unterbrechen. Verwenden Sie zum Beispiel in diesen great answer den Codeblock zu experimentieren:

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") 

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

Verhübsch-Schlechterung es:

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

Allerdings gibt es nichts hindert Sie daran, das Hinzufügen dieser Zeichen manuell: in der XML-Datei zu lesen und wieder schreiben sie, das Hinzufügen von Text, auch wenn es enthält < oder > . Wenn Sie jedoch eine korrekte XML-Datei benötigen, müssen Sie sicherstellen, dass diese Zeichen nur in Kommentarfeldern verwendet werden.

Für Ihr spezielles Problem, Sie in den Zeilen von der Client-XML-Dateien lesen kann, dann entfernen Sie entweder die < und > Zeichen oder, wenn der Kunde sie benötigt, um sie zu einer kommentierten Teil der Linie bewegen. Teil der Herausforderung ist, dass Sie in den <note>, `, etc. Teile der Datei verlassen müssen ... Dies ist eine Herausforderung, aber es wäre möglich!

Das folgende ist, was ich erwarten würde, dass das Ergebnis aussehen wird.

Verwandte Themen