Jak uciec od ampersandów w XML, aby były renderowane jako byty w HTML?


522

Mam trochę tekstu XML, który chcę renderować na stronie HTML. Ten tekst zawiera ampersanda, którego chcę, aby uczynić w swojej reprezentacji podmiotu: &.

Jak mogę uciec od tego znaku handlowego i źródłowego XML? Próbowałem &, ale jest to dekodowane jako rzeczywisty znak ampersand ( &), który jest nieprawidłowy w HTML .

Chcę więc uciec z niego w taki sposób, aby był renderowany jak &na stronie internetowej, która korzysta z danych wyjściowych XML.


1
Twierdzenie w najnowszej wersji tego pytania, że „rzeczywisty znak ampersand (&) ... jest niepoprawny w HTML”. to fałsz. Rzeczywiście, nawet zaakceptowana odpowiedź na połączone pytanie podana w uzasadnieniu stanowi „HTML5 pozwala pozostawić go bez zmian, ale tylko wtedy, gdy następujące dane nie wyglądają jak prawidłowe odwołania do znaków” .
Mark Amery

Odpowiedzi:


422

Gdy twój XML zawiera &, spowoduje to tekst &.

Gdy użyjesz tego w HTML, będzie to renderowane jako &.


195

Zgodnie z § 2.4 specyfikacji XML 1.0 powinieneś być w stanie korzystać &.

Próbowałem & amp; ale to nie jest dozwolone.

Czy na pewno nie jest to inny problem? XML jednoznacznie definiuje to jako sposób na uniknięcie ampersand.


3
Było to całkowicie uzasadnione, gdy zostało opublikowane, ale zmiany (lub być może wyjaśnienia) pytania spowodowały, że odpowiedź wydawała się bezsensowna. Po pierwsze, cytowany fragment nie jest już obecny w pytaniu.
Mark Amery

132

&Postać sama jest ucieczka w postaci XML więc rozwiązaniem jest go i po przecinku Unicode odpowiednik dla złączyć &zapewniając w ten sposób, że nie ma błędów parsowania XML. Oznacza to, że należy wymienić postać &z &.


5
Naprawdę wolę to rozwiązanie! Powinno być również możliwe użycie zapisu szesnastkowego:&
CodeManX

2
Logicznie, dlaczego miałoby to działać? Oba ciągi mają znak ampersand, w tym ten z kodem znaku na końcu ...
sijpkes

4
@sijpkes Ponieważ znak ampersand mówi analizatorowi, że następujące znaki są używane do reprezentowania innego znaku, którym w tym przypadku byłby znak ampersand. Znak ampersand nie jest w języku XML „nielegalny” - ma tylko specjalne znaczenie. Oznacza to, że „wszystkie postacie, dopóki nie trafisz średnika, powinny zostać przetłumaczone na coś innego”. Gdy masz znak ampersand normalnie, bez znaków opisowych i końcowego średnika, analizator składniowy jest zdezorientowany.
Riley Major

1
To jest dla mnie odpowiedź. Dodawanie & # 038; w Lokalizacji mojego Nagłówka Odpowiedzi naprawiłem go i nie wyświetla się Ampersand na Nagłówku Odpowiedzi. : D
iamjoshua

Przepełnienie stosu jest takie świetne. Oto prawie 11-letni post, który rozwiązuje mój problem. I obejrzano go ponad 690 000 razy.
Bill

69

Użyj CDATAtagów:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>

4
To raczej zgadywanie niż odpowiedź.
Bryan Oakley,

10
To może być zgadywanie; jest to jednak poprawne. Markery CDATA pozwalają na użycie surowych ampersand.
Quentin,

19
W oryginalnym poście nigdy nie wyjaśniono, gdzie należy użyć znaku &, tagi CDATA nie mogą być używane do wartości atrybutów, a jedynie do rzeczywistej zawartości tagów, stąd powód, dla którego umieściłem „?”.
scragar

1
Jest to również świetne do charakteryzowania danych XML i ta odpowiedź jest pomocna w wielu innych scenariuszach dotyczących renderowania XML. Dla mnie to naprawdę pomogło w Camel XML DSL, kiedy potrzebowałem ustawić treść lub nagłówek z pewnymi danymi XML, parser Camel XML zignorował zawartość CDATA, odczytując je jako strumień znaków. Bez tego silnik wielbłądów zgłasza niepoprawne wyjątki dotyczące struktury xml
Kimutai

1
Właśnie takiej odpowiedzi potrzebowałem, ponieważ w moim przypadku nie jestem pewien, jakie znaki mogą pojawiać się w XML, więc muszę uciec od wszystkiego w tej sekcji.
Matt


11

W moim przypadku musiałem to zmienić na %26.

Musiałem uciec &w adresie URL. Więc mi &amp;nie wyszło. Funkcja urlencode zmienia się &na %26. W ten sposób ani XML, ani mechanizm URL przeglądarki nie narzekały na adres URL.


8
Tak. Zauważ jednak, że OP dotyczył ucieczki w XML. Zmiana znaczenia adresu URL to inny problem. Prawdziwa zabawa zaczyna się, gdy masz adresy URL w formacie XML lub fragmenty XML w adresach URL ...
Oskar Berggren,

6

Próbowałem i wzmacniacz, ale to nie działało. Na podstawie odpowiedzi Wima Ten Brink'a wypróbowałem & amp; amp; zadziałało.

Jeden z moich kolegów programistów zaproponował mi użycie & # x26; i działało niezależnie od tego, ile razy może być renderowane.


5

&amp; to sposób na reprezentowanie znaku handlowego i w większości sekcji dokumentu XML.

Jeśli chcesz, aby XML był wyświetlany w HTML, musisz najpierw utworzyć poprawnie zakodowany XML (co wymaga zmiany &na &amp;), a następnie użyć go do stworzenia poprawnie zakodowanego HTML (co wymaga ponownej zmiany &na &amp;). To powoduje:

&amp;amp;

Aby uzyskać dokładniejsze objaśnienie kodowania XML, zobacz:

Jakie znaki muszę uciec w dokumentach XML?


4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> da rade.


3

Co powiesz na użycie Unicode \u0026? Działa dla mnie w moich plikach XML Androida. Jeśli pojawią się problemy, daj mi znać.


1
\uUcieczki nie mają ogólnego znaczenia w języku XML. -1.
Mark Amery

@ MarkAmery Tak, nie mają specjalnego znaczenia, dlatego właśnie tak dobrze działają - nie ma co interpretować, więc nie ma nic złego. Jawa interpretuje Unicode i wyświetla znak ampersand tak, jak chce OP.
Scott Biggs,

1
@ScottBiggs Co Java ma wspólnego z pytaniem PO?
Philippe-André Lorin

1
@ScottBiggs Więc to nie na temat. - 1.
Philippe-André Lorin

1
@ScottBiggs Fakt, że działa dla ciebie i że niektórzy inni mogą na tym skorzystać, nie ma znaczenia; twoją odpowiedzią jest hałas dla wszystkich innych czytelników. Ponieważ nie dotyczy to bardziej ogólnego przypadku, o który poprosił PO. Tu nie chodzi o nie dzielenie się swoim sukcesem. Chodzi o utrzymanie go tam, gdzie należy. Twój wkład może być przydatny, ale nie został tu przedstawiony jako odpowiedź. Może jako komentarz, może jako odpowiedź na inne pytanie (które możesz sam stworzyć i odpowiedzieć).
Philippe-André Lorin

0

Zastanów się, czy Twój XML wygląda jak poniżej.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

Nie można użyć <>bezpośrednio, ponieważ powoduje to błąd. W takim przypadku możesz użyć &#60;&#62;zamiast tego.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

Kliknij tutaj, aby zobaczyć wszystkie kody.


2
Myślę, że ten grunt był dobrze uwzględniony w ciągu 7 lat przed opublikowaniem tej odpowiedzi.
miken32,
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.