Jakie znaki muszę uciec w dokumentach XML?


Odpowiedzi:


1356

Jeśli użyjesz odpowiedniej klasy lub biblioteki, zrobią ci ucieczkę. Wiele problemów XML jest spowodowanych konkatenacją ciągów.

Znaki specjalne XML

Jest tylko pięć:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

Uciekające postacie zależą od tego, gdzie jest używany znak specjalny.

Przykłady można sprawdzić w usłudze weryfikacji znaczników W3C .

Tekst

Bezpiecznym sposobem jest ucieczka wszystkich pięciu znaków w tekście. Jednak trzy znaki ", 'i >nie musi być uciekł w tekście:

<?xml version="1.0"?>
<valid>"'></valid>

Atrybuty

Bezpiecznym sposobem jest ucieczka wszystkich pięciu znaków w atrybutach. Nie >trzeba jednak uciekać postaci w atrybutach:

<?xml version="1.0"?>
<valid attribute=">"/>

'Postać nie musi być uciekł w atrybutach jeśli cytaty są ":

<?xml version="1.0"?>
<valid attribute="'"/>

Podobnie "nie ma potrzeby zmiany znaczenia w atrybutach, jeśli cytaty to ':

<?xml version="1.0"?>
<valid attribute='"'/>

Komentarze

Wszystkich pięciu znaków specjalnych nie można dodawać w komentarzach:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Wszystkie pięć znaków specjalnych nie może być znakami ucieczki w sekcjach CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Instrukcje przetwarzania

Wszystkie pięć znaków specjalnych nie może być znakami ucieczki w instrukcjach przetwarzania XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML vs. HTML

HTML ma własny zestaw kodów ucieczki, które obejmują znacznie więcej znaków.


33
@Pacerier, błagam, abyś nie pisał własnego kodu ucieczki XML / HTML. Skorzystaj z funkcji bibliotecznej lub możesz przegapić specjalny przypadek.
— Jason

5
Również do podziału linii musisz użyć & # xA; & # xD; i & # x9; na karcie, jeśli potrzebujesz tych znaków w atrybucie.
— radistao

78
Jeśli masz zamiar wykonać na nich wyszukiwanie / zamianę, pamiętaj tylko, aby zrobić & amp; wymiana przed innymi.
— Doug

2
@Doug Właśnie chciałem wspomnieć o tej samej rzeczy - w przeciwnym razie wszystkie inne zastąpione postacie zostaną uszkodzone, a rzeczy takie &quot;zostaną zmienione na&amp;quot;
— Jerry Dodge

5
Z Wikipedii: „Wszystkie dozwolone znaki Unicode mogą być reprezentowane za pomocą znaków numerycznych”. Jest ich więc znacznie więcej niż 5.
— Tim Cooper

93

Być może pomoże to:

Lista odniesień do encji znakowych XML i HTML :

W dokumentach SGML, HTML i XML logiczne konstrukcje znane jako dane znakowe i wartości atrybutów składają się z sekwencji znaków, w których każdy znak może się zamanifestować bezpośrednio (reprezentując siebie) lub może być reprezentowany przez szereg znaków zwany odwołaniem do znaku, z których istnieją dwa typy: odwołanie do znaku numerycznego i odwołanie do znaku. W tym artykule wymieniono odwołania do encji znakowych, które są poprawne w dokumentach HTML i XML.

W tym artykule wymieniono pięć następujących predefiniowanych jednostek XML:

quot  "
amp   &
apos  '
lt    <
gt    >

73

Zgodnie ze specyfikacjami konsorcjum World Wide Web (w3C) istnieje 5 znaków, które nie mogą występować w postaci dosłownej w dokumencie XML , z wyjątkiem przypadków, gdy są używane jako ograniczniki znaczników lub w komentarzu, instrukcji przetwarzania lub sekcji CDATA . We wszystkich pozostałych przypadkach znaki te muszą zostać zastąpione przy użyciu odpowiedniego elementu lub odwołania numerycznego zgodnie z następującą tabelą:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Zauważ, że wyżej wspomniane jednostki mogą być używane również w HTML, z wyjątkiem & apos; , który został wprowadzony w XHTML 1.0 i nie jest zadeklarowany w HTML 4. Z tego powodu oraz w celu zapewnienia kompatybilności wstecznej specyfikacja XHTML zaleca użycie & # 39; zamiast.


14
XML predefiniuje te pięć jednostek, ale absolutnie NIE określa, że ​​nie można użyć żadnego z tych pięciu znaków w ich dosłownej formie. <i & trzeba uciec wszędzie (oprócz CDATA). "I" muszą być tylko uciekł w wartościach atrybutów, i tylko wtedy, gdy odpowiedni charakter cytat jest taki sam i> nigdy nie musi być uciekł..
— Shaun McCance

3
Jak napisano powyżej, <> „&” nie muszą być poprzedzane znakami ucieczki, gdy są używane jako ograniczniki znaczników lub w komentarzu, instrukcji przetwarzania lub sekcji CDATA, tzn. Gdy używa się <> jako znacznika XML, nie można go uniknąć To samo dotyczy komentarza (czy uniknąłbyś & w komentarzowym wierszu pliku XML? Nie musisz, a Twój XML jest nadal ważny, jeśli tego nie zrobisz). Jest to wyraźnie określone w oficjalnych zaleceniach dla XML autor: W3C .
— Albz

7
@ShaunMcCance >musi być poprzedzone znakiem ucieczki, jeśli występuje ]]w treści, chyba że ma być częścią ]]>separatora wskazującego koniec sekcji CDATA.
— Lee D

2
Nie być nekromantą, ale @Albz niesłusznie twierdzi, że te znaki MUSZĄ mieć uprawnienia do treści. Patrz sekcja 2.4 na w3.org/TR/REC-xml/#NT-CharData . Wersja TL; DR tego jest zawarta w zawartości elementu chardata, & amp; i & lt; muszą zawsze mieć uprawnienia. & Gt; znak MOŻE być uprawniony, chociaż MUSI tak być, gdy pojawia się w dosłownym ciągu „]]>”, ponieważ w przeciwnym razie zostanie to odczytane jako zakończenie sekcji CDATA. W przypadku pojedynczego i podwójnego cudzysłowu możesz uciec, jeśli chcesz. To tyle, jeśli chodzi o chardata wewnątrz elementów. Inne składniki XML mają inne reguły.
— skye --- kapitan

52

Znaki ucieczki są różne dla tagów i atrybutów.

W przypadku tagów:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

W przypadku atrybutów:

" &quot;
' &apos;

Z danych postaci i znaczników :

Znak ampersand (&) i lewy nawias kątowy (<) nie mogą występować w postaci dosłownej, z wyjątkiem przypadków, gdy są używane jako ograniczniki znaczników lub w komentarzu, instrukcji przetwarzania lub sekcji CDATA. Jeśli są potrzebne gdzie indziej, należy je uciec za pomocą odwołań do znaków numerycznych lub odpowiednio ciągów „& amp;” i „& lt;”. Nawias prostokątny (>) może być reprezentowany za pomocą ciągu „& gt;” i musi być, w celu zachowania kompatybilności, wybierany za pomocą „& gt;” lub odwołania do znaku, gdy pojawia się w ciągu „]]>„ w treści, gdy ten ciąg nie oznacza końca sekcji CDATA.

Aby wartości atrybutów mogły zawierać zarówno pojedyncze, jak i podwójne cudzysłowy, apostrof lub znak pojedynczego cudzysłowu (') mogą być reprezentowane jako „& apos;”, a znak podwójnego cudzysłowu („) jako„ & quot; „.


Oznacza to, że w przypadku atrybutów należy uciec tylko cudzysłów, ale jest to dodatek do pozostałych trzech znaków
— eug

40

Nowa, uproszczona odpowiedź na stare, często zadawane pytanie ...

Uproszczone zmiany znaczenia XML (z priorytetem, 100% kompletności)

  1. Zawsze (90% ważne do zapamiętania)

    • Ucieczka <jak &lt;chyba <jest uruchamianie <tag/>.
    • Ucieczka &jak &amp;chyba &jest rozpoczęcie &entity;.
  2. Wartości atrybutów (9% ważne do zapamiętania)

    • attr=" 'Pojedyncze cudzysłowy 'są prawidłowe w obrębie podwójnych"
    • attr=' "Podwójne cudzysłowy "są w porządku w pojedynczych cudzysłowach.'
    • Ucieczka "jak &quot;i 'jako &apos;inaczej.
  3. Komentarze , CDATA i instrukcje przetwarzania (0,9% ważne do zapamiętania)

    • <!--W komentarzach --> nie trzeba uciekać, ale --łańcuchy nie są dozwolone.
    • <![CDATA[W ramach CDATA ]]> nie trzeba nic uciekać, ale nie]]> łańcuchy są dozwolone.
    • <?PITargetW PI ?> nie trzeba uciekać, ale ?>łańcuchy nie są dozwolone.
  4. Esoterica (0,1% ważne do zapamiętania)

    • Ucieczka ]]>jak ]]&gt;chyba ]]>kończy sekcji CDATA.
      (Ta zasada dotyczy ogólnie danych znakowych - nawet poza sekcją CDATA.)

Warto zwrócić uwagę na jeszcze jedną zasadę: ]]>należy unikać ]]&gt;, nawet jeśli nie ma jej w sekcji CDATA. Najprostszym sposobem osiągnięcia, które mogą być na zawsze uciec >jak &gt;.
— Michael Kay

Dzięki, @MichaelKay. Włączyłem twoją pomocną notatkę na temat, ]]> ale zdecydowałem się przenieść ją do ezoteryki, zamiast sugerować, że > zawsze należy jej unikać (co nie musi, jak wiadomo). Moim celem jest, aby reguły ucieczki XML były łatwe do zapamiętania i w 100% dokładne .
— kjhughes

Powyższe odpowiedzi, w tym jedna zaakceptowana wzmianka, wszystkie pięć znaków powinny być umieszczone w atrybutach. Czy masz jakieś odniesienie do standardu XML, aby poprzeć to, co mówisz, ponieważ logicznie twoja odpowiedź wydaje się być poprawna?
— Roman Susi

1
@RomanSusi: Tak, wiele innych odpowiedzi zawiera błędy lub nadmierne generalizacje („Bezpieczny sposób ...”) w oparciu o pogłoski, błędną interpretację lub niezrozumienie oficjalnego XML BNF. Moja odpowiedź jest (a) w 100% uzasadniona Rekomendacją W3C XML; zobacz wiele odnośników do oficjalnej BNF i (b) zorganizowane w zwięzły, logiczny i łatwy do zapamiętania postęp tych wymagań.
— kjhughes

@RomanSusi: Konkretne stwierdzenie, że „wszystkie pięć znaków powinno być znakami ucieczki w atrybutach” to niechlujne wskazówki nieobsługiwane przez oficjalną regułę BNF, na AttValuektóre zacytowałem w mojej odpowiedzi poprzez link 2. Wartości atrybutu .
— kjhughes

25

Poza powszechnie znanymi pięcioma znakami [<,>, &, "i '], unikałbym także znaku tabulacji pionowej (0x0B). Jest to poprawny UTF-8, ale nie jest poprawny XML 1.0, a nawet wiele bibliotek (w tym bardzo przenośna (ANSI C) biblioteka libxml2 ) tęsknię i cicho wyprowadza niepoprawny XML.


11

Skrócony z: XML, Escaping

Istnieje pięć predefiniowanych jednostek:

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

„Wszystkie dozwolone znaki Unicode mogą być reprezentowane za pomocą znaków numerycznych.” Na przykład:

&#20013;

Większość znaków kontrolnych i innych zakresów Unicode jest wyraźnie wykluczonych, co oznacza (myślę), że nie mogą wystąpić ani w postaci znaku ucieczki, ani bezpośredniego:

Prawidłowe znaki w XML


3

To zależy od kontekstu. W przypadku treści jest to < i & oraz ]]> (choć ciąg trzech znaków zamiast jednego znaku).

W przypadku wartości atrybutów jest to < , & , „ i ” .

W przypadku CDATA jest to ]]> .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.