2015-04-01 7 views
9

Mam plik XML od klienta, który ma więcej niż > i mniej niż < w nim znaków i nie sprawdza formatu XML. Czy istnieje sposób obejścia tego bez pytania klienta o naprawienie pliku?Czy istnieje sposób uwzględnienia większej lub mniejszej liczby znaków w pliku XML?

np.

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

Jeśli nie chcesz poprosić klienta o naprawienie pliku, oczywistym rozwiązaniem jest samodzielne rozwiązanie problemu. Jeśli jest to element jednorazowy, zmodyfikuj go i zastąp zastrzeżone znaki predefiniowanymi odwołaniami do encji; jeśli zdarzy się to wielokrotnie, napisz skrypt sed lub jego odpowiednik w edytorze wsadowym, aby dokonać zmiany. (Jeśli nie masz edytora wsadowego z wyboru i napotykasz na problemy takie jak to, powinieneś nauczyć się o edytorach wsadowych i uzyskać dobry wynik w jednym). –

Odpowiedz

3

Będziesz musiał używać znaków XML ucieczki: uciekających

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

Google znaki w języku XML, aby uzyskać więcej informacji.

1

bezpośrednia odpowiedź na Twoje pytanie:

Czy istnieje sposób, aby obejść ten problem, nie pytając klienta naprawić plik?

to "nie". Dane, które otrzymujesz, nie są poprawnymi danymi XML i masz rację, odrzucając je. Gorąco polecam powrót do klienta i powiedzenie, że musi on dostarczyć poprawny XML, używając Reakcji jednostek postaci, o której wspominali David i Rahul.

0

Aby odpowiedzieć na to pytanie jasno nr, nie można mieć plik XML z < lub > w którymkolwiek z pól wartości, gdyż format XML używa tych znaków do oznaczenia elementów rodzicem a dzieckiem, na przykład <note>, <to>, <from> itp

Rozwijając moją odpowiedź: Kiedy skrypt Pythona pisze < lub > pomocą XML library, biblioteka przekłada je do &lt lub &gt odpowiednio. Nie sądzę, że jest to możliwe w tej bibliotece, ponieważ w rzeczywistości odfiltrowuje znaki < i , a także Referencje jednostki znaku. Ma to sens - biblioteka XML zapobiega zakłócaniu składni użytej dla obiektu macierzystego: xml.etree.cElementTree.Element lub dowolnego obiektu potomnego xml.etree.cElementTree.SubElement. Na przykład za pomocą bloku kodu w tym great answer do eksperymentu:

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

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

Prettifying go:

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

Jednak nie ma nic Cię powstrzymuje się od wprowadzania tych znaków ręcznie: czytaj w pliku XML i ponownie zapisać go, dodawanie tekstu, nawet jeśli zawiera < lub > . Jeśli jednak potrzebujesz odpowiedniego pliku XML, upewnij się, że te znaki są używane tylko w polach komentarzy.

dla danego problemu, można przeczytać w linii z plików XML klienta, to albo usunąć < i > znaków lub, jeśli klient wymaga od nich, przenieść je do skomentował części linii. Częścią wyzwania jest to, że musisz zostawić fragmenty pliku w pliku <note>, ... To jest trudne, ale byłoby to możliwe!

Oto, jak bym oczekiwał, że wynik będzie wyglądał.

<?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> 
Powiązane problemy