2009-05-16 12 views
5

Mam plik, który jest w formacie XML (składa się tylko z początkowych i końcowych znaczników root oraz elementów podrzędnych katalogu głównego). Elementy tekstowe dzieci zawierają ampersand symbol &. W XML nie można mieć tego symbolu, aby dokument był ważny, a kiedy próbowałem przetworzyć plik przy użyciu DOM API w Javie i analizatora składni XML, uzyskałem błędy parsowania. Dlatego zastąpiłem & z & i pomyślnie przetworzyłem plik: musiałem wyodrębnić wartości elementów tekstowych w różnych plikach tekstowych.Znaki specjalne w plikach XML - przetwarzanie przy użyciu DOM API

Gdy otworzyłem te nowo utworzone pliki tekstowe, spodziewałem się zobaczyć &, ale zamiast tego było &. Dlaczego to? Przechowałem tekst w plikach tekstowych bez żadnego rozszerzenia (mój oryginalny plik w formacie XML również nie miał rozszerzenia .xml), a ja mam tylko & w tekście nowego pliku, bez względu na to, jak otworzę plik: jako plik txt lub xml (są to niektóre opcje w moim edytorze XML). Co dokładnie dzieje się? Czy Java (?) Automatycznie przekształca & na &? Czy jest jakieś domyślne kodowanie? No cóż, & oznacza &, i przypuszczam, że istnieje pewne "niewidzialne" automatyczne przekształcenie, ale jestem zdezorientowany, kiedy i jak to się dzieje. Oto przykłady mojego oryginalnego pliku i wyodrębnionego pliku które otrzymują po tym, jak przetwarzane oryginalnego pliku z Java:

To jest moja „negative.review” plik w formacie XML:

<review> 
<review_text> 
I will not wear it as it is too big &amp; looks funny on me. 
</review_text> 
</review> 

To jest mój wyodrębniony plik „negative_1”:

I will not wear it as it is too big & looks funny on me. 

dla mnie ważne jest, aby mieć oryginalne dane, jak to jest (nie robiąc żadnych konwersji/zastępstwa), więc pomyślałem, że muszę przetwarzać wyodrębniony plik „negative_1” konwersja wstecz &amp; do &. Jak widzisz, wygląda na to, że nie muszę tego robić. Ale nie rozumiem dlaczego :(.

Z góry dziękuję!

+1

Tylko uwaga: "składa się tylko z początkowych i końcowych znaczników roota i dzieci z korzenia". To jest sama definicja XML (jest tylko jeden element główny). – PhiLho

+0

http://stackoverflow.com/questions/4341145/how-to-deal-with-special-characters-in-urls-inside-xml – sandeepKumar

Odpowiedz

11

powód jest prosty. plik XML naprawdę zawiera"&" charakter

to jest tylko reprezentowana inaczej (czyli jest to „uciekł”), ponieważ prawdziwy.na własne pliki XML, jak widzieliście. Przeczytaj odpowiednią sekcję w specyfikacji XML 1.0: "2.4 Character Data and Markup". To tylko kilka linijek, ale dość dobrze wyjaśnia to zagadnienie.

XML jest reprezentacją danych (!). Nie myśl o tym jako o pliku tekstowym. Przykład:

Chcesz zapisać ciąg "17 < 20" w pliku XML. Początkowo nie możesz, ponieważ "<" jest zarezerwowany jako wspornik otwierającego tagu.Więc byłoby to nieprawidłowy:

<xml>17 < 20</xml> 

Rozwiązanie: zatrudniać charakter ucieczki na specjalne/zastrzeżone charakteru, tylko za pomocą zachowaniu ważności pliku:

<xml>17 &lt; 20</xml> 

Dla wszystkich celów praktycznych powyżej fragment zawiera następujące dane (w reprezentacji JSON ten czas):

{ 
    "xml": "17 < 20" 
} 

Dlatego widać prawdziwą "&" w post-processing. Uciekł w ten sam sposób, ale jest to , co oznacza, że ​​ pozostało takie samo przez cały czas.

Powyższy przykład wyjaśnia również, dlaczego "&" musi być traktowany specjalnie: Sam jest częścią mechanizmu ucieczki XML. Oznacza początek sekwencji ucieczki, tak jak w "&lt;". Dlatego też musi się wymknąć (z "&amp;", tak jak zrobiłeś).

+0

Wspaniała odpowiedź ... jak zwykle! +1 – Cerebrus

2

Wszelkie parsera XML będzie pośrednio przekładają podmioty takie jak &amp;, &lt;, &gt;, do odpowiednich znaków, jako część procesu parsowania plik