Pracuję z niektórymi plikami XML, które przechowują ciągi, takie jak:
<node>This is a string</node>
Niektóre z tych łańcuchów, które mam przechodzących do węzłów będą miały znaków podoba &
, #
, $
itp .:
<node>This is a string & so is this</node>
To nie jest ważne z powodu &
.
Nie mogę zawinąć tych ciągów w CDATA, ponieważ muszą być takie, jakie są. Próbowałem znaleźć listę znaków, których nie można umieścić w węzłach XML bez posiadania CDATA.
Czy ktoś może skierować mnie w jedną stronę lub dostarczyć listę nielegalnych postaci?
Odpowiedzi:
Jedyne znaki są nielegalne
&
,<
a>
(jak również"
czy'
w atrybutach).Oni uciekł korzystając podmioty XML , w tym przypadku chcesz
&
za&
.Naprawdę powinieneś jednak użyć narzędzia lub biblioteki, która pisze dla ciebie XML i abstraktuje tego rodzaju rzeczy, abyś nie musiał się tym martwić.
źródło
OK, oddzielmy pytanie o znaki, które:
Odpowiedź udzielona przez @dolmen w „ Co to są nieprawidłowe znaki w XML ” jest nadal aktualna, ale musi zostać zaktualizowana zgodnie ze specyfikacją XML 1.1.
1. Niepoprawne znaki
Opisane tutaj znaki to wszystkie znaki, które można wstawić do dokumentu XML.
1.1 W XML 1.0
Globalna lista dozwolonych znaków to:
Zasadniczo znaki sterujące i znaki spoza zakresu Unicode są niedozwolone. Oznacza to również, że wywołanie na przykład encji znakowej

jest zabronione.1.2 W XML 1.1
Globalna lista dozwolonych znaków to:
Ta wersja zalecenia XML rozszerzyła dozwolone znaki, więc znaki kontrolne są dozwolone, i uwzględnia nową wersję standardu Unicode, ale te wciąż są niedozwolone: NUL (x00) , xFFFE , xFFFF ...
Jednak stosowanie znaków kontrolnych i niezdefiniowanych znaków Unicode jest odradzane.
Można również zauważyć, że wszystkie parsery nie zawsze uwzględniają to, a dokumenty XML ze znakami kontrolnymi mogą zostać odrzucone.
2. Znaki, które należy uciec (aby uzyskać dobrze sformułowany dokument):
<
Musi być uciekł z<
jednostki, gdyż przyjmuje się za początek znacznika.&
Musi być uciekł z&
jednostki, gdyż przyjmuje się za początek odesłanie podmiot>
Należy uciekł z>
jednostki. Nie jest to obowiązkowe - zależy od kontekstu - ale zdecydowanie zaleca się jego uniknięcie.'
Należy uciekł z A'
jednostki - Obowiązkowe w atrybutach zdefiniowanych w apostrofach ale zaleca się, aby zawsze przed nim uciec."
Należy uciekł z"
jednostki - Obowiązkowe w atrybutach zdefiniowanych wewnątrz cudzysłowów, ale zaleca się, aby zawsze przed nim uciec.źródło
Lista prawidłowych znaków znajduje się w specyfikacji XML :
źródło
& < > " '
należy je unikać w określonych kontekstach.Jest to kod C #, aby usunąć niepoprawne znaki XML z ciągu i zwrócić nowy prawidłowy ciąg.
źródło
\u10000
i\u10FFFF
jako pojedyncze znaki, ponieważ wymagają one dwóchchar
instancji utf-16 , i zgodnie z dokumentacją może być nie więcej niż 4 cyfry.[\u10000-\u10FFFF]
najprawdopodobniej jest analizowany jako [\u1000
,0-\u10FF
,F
,F
], co jest dziwne, patrząc jednak legalne.Wstępnie zadeklarowane postacie to:
Aby uzyskać więcej informacji, zobacz „ Jakie są znaki specjalne w XML? ”.
źródło
Oprócz odpowiedzi potame, jeśli chcesz uciec za pomocą bloku CDATA.
Jeśli umieścisz tekst w bloku CDATA, nie musisz używać klawisza zmiany znaczenia . W takim przypadku możesz użyć wszystkich znaków z następującego zakresu :
Uwaga: Ponadto nie możesz używać
]]>
sekwencji znaków. Ponieważ pasowałby do końca bloku CDATA.Jeśli nadal występują nieprawidłowe znaki (np. Znaki kontrolne), prawdopodobnie lepiej jest użyć pewnego rodzaju kodowania (np. Base64).
źródło
Innym łatwym sposobem na uniknięcie potencjalnie niechcianych znaków XML / XHTML w C #:
źródło
Innym sposobem na usunięcie niepoprawnych znaków XML w języku C #
XmlConvert.IsXmlChar
(dostępne od .NET Framework 4.0)lub możesz sprawdzić, czy wszystkie znaki są poprawne XML:
.Net Fiddle
Na przykład pionowy symbol tabulacji (
\v
) nie jest poprawny dla XML, jest poprawny UTF-8, ale nie jest poprawny XML 1.0, a nawet wielu bibliotekom (w tym libxml2) brakuje go i cicho wyprowadza nieprawidłowy XML.źródło
Podsumowując, prawidłowe znaki w tekście to:
&
i<
.>
nie jest ważny, jeśli następuje]]
.Sekcje 2.2 i 2.4 specyfikacji XML zawierają szczegółową odpowiedź:
Postacie
Dane postaci
źródło
„ XmlWriter i niższe znaki ASCII ” działały dla mnie
źródło
W języku C # użyj
System.Security.SecurityElement.Escape
lub,System.Net.WebUtility.HtmlEncode
aby uciec przed tymi nielegalnymi postaciami.źródło
Dla ludzi Javy Apache ma klasę narzędziową (
StringEscapeUtils
), która ma metodę pomocniczą,escapeXml
której można użyć do zmiany znaczenia znaków w ciągu za pomocą encji XML.źródło
W procesorze XML Woodstox nieprawidłowe znaki są klasyfikowane według tego kodu:
Źródło stąd
źródło
Ktoś tego próbował
System.Security.SecurityElement.Escape(yourstring)
? Spowoduje to zastąpienie niepoprawnych znaków XML w łańcuchu ich prawidłowym odpowiednikiem.źródło
Do XSL (w naprawdę leniwe dni) używam:
tłumaczyć wszystkie znaki, które nie są obserwowane na stronie; do właściwych.
Mamy przypadki, w których dane wejściowe są w formacie CDATA, ale system, który używa XML, nie bierze tego pod uwagę. To niechlujna poprawka, uważaj ...
źródło