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.

Welbog
źródło
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    >
Andrew Hare
źródło
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.

Albz
źródło
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; „.

Peter Bartels
źródło
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.)
kjhughes
źródło
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.

Charon ME
źródło
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

Tim Cooper
źródło
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 ]]> .

把 友情 留 在 无 盐
źródło