Di quali caratteri ho bisogno per fuggire nei documenti XML?


Risposte:


1356

Se usi una classe o una biblioteca appropriate, queste faranno la fuga per te. Molti problemi XML sono causati dalla concatenazione di stringhe.

Caratteri di escape XML

Ce ne sono solo cinque:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

I caratteri di escape dipendono da dove viene utilizzato il personaggio speciale.

Gli esempi possono essere convalidati presso il servizio di convalida markup W3C .

Testo

Il modo sicuro è di sfuggire a tutti e cinque i caratteri nel testo. Tuttavia, i tre personaggi ", 'e >non devono essere sfuggiti nel testo:

<?xml version="1.0"?>
<valid>"'></valid>

attributi

Il modo sicuro è sfuggire a tutti e cinque i caratteri negli attributi. Tuttavia, il >personaggio non deve essere sfuggito agli attributi:

<?xml version="1.0"?>
<valid attribute=">"/>

Non è 'necessario sfuggire al personaggio negli attributi se le virgolette sono ":

<?xml version="1.0"?>
<valid attribute="'"/>

Allo stesso modo, "non è necessario sfuggire agli attributi se le virgolette sono ':

<?xml version="1.0"?>
<valid attribute='"'/>

Commenti

Tutti e cinque i caratteri speciali non devono essere esclusi nei commenti:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Tutti e cinque i caratteri speciali non devono essere salvati nelle sezioni CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Istruzioni di elaborazione

Tutti e cinque i caratteri speciali non devono essere sottoposti a escape nelle istruzioni di elaborazione XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML vs. HTML

HTML ha una propria serie di codici di escape che coprono molti più caratteri.


33
@Pacerier, ti prego di non scrivere il tuo codice di escape XML / HTML. Usa una funzione di libreria o ti perderai un caso speciale.
Jason

5
Anche per le interruzioni di riga devi usare & # xA; & # xD; e & # x9; per scheda, se hai bisogno di questi caratteri in un attributo.
radistao,

78
Se hai intenzione di fare un Trova / Sostituisci su questi, ricorda di fare il & amp; sostituzione prima delle altre.
Doug,

2
@Doug Stavo per menzionare la stessa identica cosa - altrimenti tutti gli altri personaggi sostituiti saranno corrotti e cose come &quot;verranno cambiate in&amp;quot;
Jerry Dodge il

5
Da Wikipedia: "Tutti i caratteri Unicode consentiti possono essere rappresentati con un riferimento di carattere numerico". Quindi ce ne sono molti di più di 5.
Tim Cooper,

93

Forse questo aiuterà:

Elenco dei riferimenti alle entità di caratteri XML e HTML :

Nei documenti SGML, HTML e XML, i costrutti logici noti come dati di carattere e valori di attributo sono costituiti da sequenze di caratteri, in cui ogni personaggio può manifestarsi direttamente (rappresentandosi), oppure può essere rappresentato da una serie di caratteri denominati riferimenti a caratteri, di cui esistono due tipi: un riferimento di carattere numerico e un riferimento di entità di carattere. Questo articolo elenca i riferimenti alle entità carattere validi nei documenti HTML e XML.

Quell'articolo elenca le seguenti cinque entità XML predefinite:

quot  "
amp   &
apos  '
lt    <
gt    >

73

Secondo le specifiche del World Wide Web Consortium (w3C), ci sono 5 caratteri che non devono apparire nella loro forma letterale in un documento XML , tranne quando usati come delimitatori di markup o all'interno di un commento, un'istruzione di elaborazione o una sezione CDATA . In tutti gli altri casi, questi caratteri devono essere sostituiti utilizzando l'entità corrispondente o il riferimento numerico secondo la seguente tabella:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Nota che le suddette entità possono essere usate anche in HTML, ad eccezione di & apos; , che è stato introdotto con XHTML 1.0 e non è dichiarato in HTML 4. Per questo motivo e per garantire la retrocompatibilità, la specifica XHTML raccomanda l'uso di & # 39; anziché.


14
XML predefinisce queste cinque entità, ma NON specifica assolutamente che non è possibile utilizzare nessuno di questi cinque caratteri nella loro forma letterale. <e & devono essere salvati ovunque (tranne CDATA). "e 'necessario eseguire l'escaping solo nei valori degli attributi e solo se il carattere di virgolette corrispondente è lo stesso. E> non deve mai essere evitato.
Shaun McCance,

3
Come scritto sopra, <> "& 'non deve essere sottoposto a escape quando viene utilizzato come delimitatore di markup o all'interno di un commento, un'istruzione di elaborazione o una sezione CDATA. Ad esempio, quando si utilizza <> come tag XML, non si esce Stessa cosa per un commento (vorresti evitare un & in una riga commentata di un file XML? Non è necessario e il tuo XML è ancora valido se non lo fai). Questo è chiaramente specificato nelle raccomandazioni ufficiali per XML by W3C .
Albz,

7
@ShaunMcCance >deve essere escluso se segue il ]]contenuto, a meno che non sia destinato a far parte del ]]>delimitatore che indica la fine di una sezione CDATA.
Lee D,

2
Non essere un negromante, ma @Albz non è corretto nel dire che questi personaggi DEVONO essere ammessi nei contenuti. Vedere la sezione 2.4 su w3.org/TR/REC-xml/#NT-CharData . La versione TL; DR è quella nel contenuto degli elementi chardata, & amp; e & lt; deve essere sempre autorizzato. Il & gt; il carattere PUO 'essere abilitato, sebbene DEVE esserlo quando appare nella stringa letterale “]]>” perché altrimenti verrà letto come terminante una sezione CDATA. Per virgolette singole e doppie, puoi scappare se vuoi. Ecco fatto, per chardata all'interno di elementi. Altri componenti di XML hanno altre regole.
skye --- capitano

52

I caratteri di escape sono diversi per tag e attributi.

Per i tag:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Per attributi:

" &quot;
' &apos;

Da Dati carattere e Markup :

Il carattere e commerciale (&) e la parentesi angolare sinistra (<) non devono apparire nella loro forma letterale, tranne quando utilizzati come delimitatori di markup o all'interno di un commento, un'istruzione di elaborazione o una sezione CDATA. Se sono necessari altrove, devono essere salvati utilizzando rispettivamente i riferimenti ai caratteri numerici o le stringhe "& amp;" e "& lt;". La parentesi ad angolo retto (>) può essere rappresentata usando la stringa "& gt;" e, per compatibilità, deve essere sfuggita usando "& gt;" o un riferimento di carattere quando appare nella stringa "]]>" nel contenuto, quando quella stringa non segna la fine di una sezione CDATA.

Per consentire ai valori di attributo di contenere virgolette singole e doppie, l'apostrofo o il carattere a virgoletta singola (') può essere rappresentato come "& apos;" e il carattere di virgoletta doppia (") come" & quot; ".


Ciò implica che per gli attributi devono essere evitate solo le virgolette, ma questo è in aggiunta agli altri tre caratteri
evitate

40

Nuova risposta semplificata a una vecchia domanda comune ...

Escaping XML semplificato (priorità, completo al 100%)

  1. Sempre (importante al 90% da ricordare)

    • Scappa <come &lt;se non <stia iniziando a <tag/>.
    • Fuga &come &amp;se non &stia iniziando un &entity;.
  2. Valori di attributo (9% importante da ricordare)

    • attr=" 'Le virgolette singole 'vanno bene tra virgolette doppie."
    • attr=' "Le virgolette doppie "vanno bene tra virgolette singole.'
    • Fuga "come &quot;e 'come &apos;altrimenti.
  3. Commenti , CDATA e istruzioni di elaborazione (0,9% importante da ricordare)

    • <!--Nei commenti --> non deve essere evitato nulla, ma non --sono consentite stringhe.
    • <![CDATA[ Entro CDATA ]]> non deve essere evitato nulla, ma non ]]>sono consentite stringhe.
    • <?PITargetAll'interno dei PI ?> nulla deve essere evitato, ma non ?>sono consentite stringhe.
  4. Esoterica (0,1% importante da ricordare)

    • Scappa ]]>come ]]&gt;se non ]]>stia terminando una sezione CDATA.
      (Questa regola si applica ai dati dei personaggi in generale, anche al di fuori di una sezione CDATA.)

Un'altra regola degna di nota: ]]>deve essere evasa come ]]&gt;, anche quando non è in una sezione CDATA. Il modo più semplice per raggiungerlo potrebbe essere quello di sfuggire sempre> a &gt;.
Michael Kay,

Grazie, @MichaelKay. Ho incorporato la tua nota utile, ]]> ma ho scelto di relegarla in esoterica piuttosto che suggerire che sia > sempre evaso (cosa che non deve essere, come sai). Il mio obiettivo qui è rendere le regole di escape XML facili da ricordare e accurate al 100% .
kjhughes,

Le risposte di cui sopra, compresa una menzione accettata, devono essere evitate all'interno di tutti e cinque i caratteri. Hai qualche riferimento allo standard XML a sostegno di ciò che stai dicendo poiché la tua risposta logicamente sembra essere quella corretta?
Roman Susi,

1
@RomanSusi: Sì, molte altre risposte contengono errori o generazioni eccessive ("La via sicura ...") basate su sentito dire, interpretazioni errate o incomprensioni del BNF XML ufficiale. La mia risposta è (a) giustificata al 100% dalla Raccomandazione XML del W3C; vedere i numerosi riferimenti collegati al BNF ufficiale e (b) organizzati in una progressione concisa, logica e facilmente ricordabile di tali requisiti.
kjhughes,

@RomanSusi: l'affermazione specifica che "tutti e cinque i caratteri devono essere sfuggiti agli attributi" è una guida sciatta non supportata dalla regola BNF ufficiale per AttValuecitata nella mia risposta tramite un link su 2. Valori degli attributi .
kjhughes,

25

Oltre ai cinque caratteri comunemente noti [<,>, &, "e '], vorrei anche sfuggire al carattere di tabulazione verticale (0x0B). È UTF-8 valido, ma non XML 1.0 valido e anche molte librerie (inclusa la libreria altamente portatile (ANSI C) libxml2 ) manca e restituisce silenziosamente XML non valido.


11

Estratto da: XML, Escaping

Esistono cinque entità predefinite:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Tutti i caratteri Unicode consentiti possono essere rappresentati con un riferimento di carattere numerico." Per esempio:

&#20013;

La maggior parte dei caratteri di controllo e altri intervalli Unicode sono specificamente esclusi, il che significa (penso) che non possono verificarsi né in escape né in diretti:

Caratteri validi in XML


3

Dipende dal contesto. Per il contenuto, è < e & , e ]]> (sebbene una stringa di tre anziché un carattere).

Per i valori degli attributi, è < , & , " e ' .

Per CDATA, è ]]> .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.