@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 "zostaną zmienione na"
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.
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:
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ą:
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.
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:
< <
> > (only for compatibility, read below)
& &
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; „.
Warto zwrócić uwagę na jeszcze jedną zasadę: ]]>należy unikać ]]>, nawet jeśli nie ma jej w sekcji CDATA. Najprostszym sposobem osiągnięcia, które mogą być na zawsze uciec >jak >.
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.
„Wszystkie dozwolone znaki Unicode mogą być reprezentowane za pomocą znaków numerycznych.” Na przykład:
中
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:
<company>AT&T</company>
Odpowiedzi:
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ęć:
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:Atrybuty
Bezpiecznym sposobem jest ucieczka wszystkich pięciu znaków w atrybutach. Nie
>
trzeba jednak uciekać postaci w atrybutach:'
Postać nie musi być uciekł w atrybutach jeśli cytaty są"
:Podobnie
"
nie ma potrzeby zmiany znaczenia w atrybutach, jeśli cytaty to'
:Komentarze
Wszystkich pięciu znaków specjalnych nie można dodawać w komentarzach:
CDATA
Wszystkie pięć znaków specjalnych nie może być znakami ucieczki w sekcjach CDATA :
Instrukcje przetwarzania
Wszystkie pięć znaków specjalnych nie może być znakami ucieczki w instrukcjach przetwarzania XML:
XML vs. HTML
HTML ma własny zestaw kodów ucieczki, które obejmują znacznie więcej znaków.
źródło
"
zostaną zmienione na&quot;
Być może pomoże to:
Lista odniesień do encji znakowych XML i HTML :
W tym artykule wymieniono pięć następujących predefiniowanych jednostek XML:
źródło
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
< < <
> > >
" " "
& & &
' ' '
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.
źródło
>
musi być poprzedzone znakiem ucieczki, jeśli występuje]]
w treści, chyba że ma być częścią]]>
separatora wskazującego koniec sekcji CDATA.Znaki ucieczki są różne dla tagów i atrybutów.
W przypadku tagów:
W przypadku atrybutów:
Z danych postaci i znaczników :
źródło
Nowa, uproszczona odpowiedź na stare, często zadawane pytanie ...
Uproszczone zmiany znaczenia XML (z priorytetem, 100% kompletności)
Zawsze (90% ważne do zapamiętania)
<
jak<
chyba<
jest uruchamianie<tag/>
.&
jak&
chyba&
jest rozpoczęcie&entity;
.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.'
"
jak"
i'
jako'
inaczej.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.<?PITarget
W PI?>
nie trzeba uciekać, ale?>
łańcuchy nie są dozwolone.Esoterica (0,1% ważne do zapamiętania)
]]>
jak]]>
chyba]]>
kończy sekcji CDATA.(Ta zasada dotyczy ogólnie danych znakowych - nawet poza sekcją CDATA.)
źródło
]]>
należy unikać]]>
, nawet jeśli nie ma jej w sekcji CDATA. Najprostszym sposobem osiągnięcia, które mogą być na zawsze uciec>
jak>
.]]>
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 .AttValue
które zacytowałem w mojej odpowiedzi poprzez link 2. Wartości atrybutu .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.
źródło
Skrócony z: XML, Escaping
Istnieje pięć predefiniowanych jednostek:
„Wszystkie dozwolone znaki Unicode mogą być reprezentowane za pomocą znaków numerycznych.” Na przykład:
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
źródło
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
Tylko
<
i&
należy je uciec, jeśli mają być traktowane dane znaków, a nie znaczniki:2.4 Dane o znakach i znaczniki
źródło