Wszystkie artykuły

XML Entities: escapowanie znaków w dokumentach XML

Podobnie jak HTML, XML używa nawiasów ostrokątnych i znaku ampersand do oznaczania znaczników, więc te znaki nie mogą pojawić się w treści tekstowej wprost — dokument przestaje być poprawnym XML-em, a parser zatrzymuje się z błędem zamiast zignorować problem, tak jak robi to przeglądarka z uszkodzonym HTML-em.

Pięć obowiązkowych encji

W przeciwieństwie do HTML-a, który definiuje setki nazwanych encji, specyfikacja XML wymaga tylko pięciu:

  • &lt; — zamiast <
  • &gt; — zamiast >
  • &amp; — zamiast &
  • &apos; — zamiast apostrofu '
  • &quot; — zamiast cudzysłowu "

Cudzysłowy trzeba escapować tylko wewnątrz wartości atrybutów, natomiast < i & — w dowolnym miejscu treści tekstowej.

Gdzie to naprawdę ma znaczenie

Krajowy System e-Faktur (KSeF) opiera się na formacie XML (schemat FA_VAT), a nazwa firmy zawierająca ampersand — na przykład "Kowalski & Wspólnicy" — unieważnia całą fakturę, jeśli znak nie zostanie zescapowany. Ten sam problem dotyczy kanałów RSS portali informacyjnych: jeden nagłówek z niezescapowanym & psuje cały kanał dla każdego czytnika, który próbuje go wczytać.

Dlaczego XML jest bardziej rygorystyczny niż HTML

Przeglądarki zwykle tolerują błędny HTML i próbują wyświetlić stronę mimo błędów. Parsery XML tak nie działają: jeden niezescapowany ampersand albo nawias ostrokątny unieważnia cały dokument, a przetwarzanie zatrzymuje się z błędem.

Kiedy się to przydaje

  • Przygotowanie tekstu wprowadzonego przez użytkownika przed wstawieniem do dokumentu XML (kanały, pliki konfiguracyjne, wiadomości SOAP).
  • Diagnostyka: zobaczenie surowego tekstu ukrytego za encjami w otrzymanym XML-u.
  • Ręczna edycja plików XML bez psucia struktury dokumentu.

Alternatywa dla encji: sekcja CDATA

Gdy blok tekstu zawiera wiele znaków specjalnych — na przykład fragment HTML-a lub kodu osadzony w XML-u — wygodniej jest opakować go w <![CDATA[...]]>, gdzie < i & nie wymagają escapowania i są traktowane jak zwykły tekst. Jedynym wyjątkiem jest sekwencja ]]>, która zamyka CDATA i dlatego nie może wystąpić wewnątrz samej zawartości sekcji.

Wypróbuj narzędzie