2009-09-09 11 views
28

Sto usando XML per condividere contenuti HTML. AFAIK, ho potuto incorporare l'HTML:HTML all'interno di XML. Dovrei usare CDATA o codificare l'HTML

  • Codifica: non so se è completamente sicuro da usare. E dovrei decodificarlo di nuovo.

  • Usa sezioni CDATA: Potrei avere ancora problemi se il contenuto contiene il tag di chiusura "]]>" e alcuni caratteri esadecimali, credo. D'altra parte, il parser XML estrae le informazioni in modo trasparente per me.

Quale opzione dovrei scegliere?

AGGIORNAMENTO: il xml verrà creato in java e passato come una stringa a un servizio Web .net, dove sarà analizzato indietro. Pertanto devo essere in grado di esportare l'xml come stringa e caricarlo usando "doc.LoadXml (xmlString);"

risposta

24

Le due opzioni sono quasi identiche. Qui ci sono i tuoi due scelte:

<html>This is &lt;b&gt;bold&lt;/b&gt;</html> 

<html><![CDATA[This is <b>bold</b>]]></html> 

In entrambi i casi, si controlla la stringa per i caratteri speciali da sfuggiti. Molte persone fanno finta che le stringhe CDATA non abbiano bisogno di fuggire, ma come si fa notare, è necessario assicurarsi che "]]>" non scivoli senza caratteri di escape.

In entrambi i casi, il processore XML restituirà la stringa decodificata.

+1

L'unico motivo per cui sceglierei di non usare CDATA, è che di solito la maggior parte dei dati non richiede l'escape, ed è un disastro vedere così tanti wrapper CDATA sul testo che non hanno bisogno di escape.Il primo metodo indica che occasionalmente hai codifiche HTML, ma la maggior parte delle volte hai un testo pulito e senza wrapper non necessario. Naturalmente questo potrebbe essere diverso a seconda dei dati tipici. – AaronLS

8

CDATA per semplicità.

0

Codifica funzionerà correttamente ed è affidabile. Puoi codificare sezioni codificate ecc. Senza alcuna difficoltà.

La decodifica verrà eseguita automaticamente da qualsiasi parser XML utilizzato per gestire il codice HTML codificato.

0

Penso che la risposta dipenda da cosa si intende fare con il contenuto HTML e anche dal tipo di contenuto HTML che si intende supportare.

Soprattutto quando si tratta di javascript incluso, la codifica comporta spesso problemi. CDATA ti aiuta sicuramente lì.

Se si prevede di utilizzare solo piccoli snippet (ad esempio un paragrafo) e avere un modo per pre-elaborarlo/filtrarlo (perché non si vuole comunque javascript o cose di fantasia), probabilmente starai meglio con la codifica o in realtà solo mettendolo direttamente come sottostruttura in xml. È quindi possibile anche post-elaborare l'html (ad esempio lo stile del filtro o gli attributi onclick). Ma questo è sicuramente più lavoro.

1

Non so quale builder XML stai usando, ma PHP (in realtà libxml) sa come gestire ]]> all'interno delle sezioni CDATA, e così dovrebbe ogni altro framework XML. Quindi, userei una sezione CDATA.

0

È possibile utilizzare la combinazione di entrambi. Ad esempio: si desidera passare <h1>....</h1> nel nodo xml per utilizzare la sezione CDATA per passarlo. I contenuti all'interno di <h1>...</h1> devono essere codificati in entità html come ad es. &lt;, per <. La codifica tra tag risolverà il problema di]]> viene interpretato mentre viene convertito in ]]&gt; e i tag html non contengono ]]>.

È possibile eseguire questa operazione solo se html viene generato da soli.

1

Ha senso avvolgere l'HTML in CDATA. Il testo HTML probabilmente costituirà un singolo valore in XML.

Quindi non averlo inserito in CDATA farà sì che tutti i parser xml lo leggeranno come parte del documento XML. Mentre è facile aggirare questo problema mentre si utilizza l'xml, perché il mal di testa in più?

Se si desidera effettivamente analizzare l'HTML in un DOM, è meglio leggere il testo HTML e impostare un parser per leggere il test separatamente.

Spero che sia uscito come volevo.

11

CDATA è più facile da leggere a occhio aperto, mentre il contenuto codificato può contenere in modo sicuro i marcatori CDATA in esso, ma non devi preoccuparti. Basta usare una libreria XML e smettere di preoccuparsene. Quindi tutto quello che devi dire è "Metti questo testo dentro questo elemento" e la libreria lo codificherà o lo avvolgerà nei marcatori CDATA.

1

Personalmente, odio i segmenti CDATA, quindi preferisco usare la codifica. Ovviamente, se si aggiunge XML a XML in XML, ciò comporterebbe la codifica per la codifica rispetto alla codifica e quindi alcuni risultati molto illeggibili. Perché odio i segmenti CDATA? Vorrei sapere. Preferenza personale, per lo più Semplicemente non mi piace abituarmi ad aggiungere "personaggi proibiti" all'interno di un segmento speciale in cui a loro sarebbe improvvisamente permesso di nuovo. Mi confonde quando vedo il markup XML all'interno di un segmento CDATA e non fa parte dell'XML che lo circonda. Almeno con la codifica vedrò che è codificato.

Le buone librerie XML gestiscono sia la codifica che i segmenti CDATA in modo trasparente. Sono solo i miei occhi che si fanno male.

0

Se il codice HTML è ben formato, è sufficiente incorporare i tag HTML senza eseguire l'escape o il wrapping in CDTATA. Se possibile, aiuta a mantenere i tuoi contenuti in XML. Ti dà più flessibilità per trasformare e manipolare il documento.

È possibile impostare uno spazio dei nomi per l'HTML, in modo da poter disambiguare i tag HTML dagli altri XML che lo avvolgono.

Il testo in escape indica che l'intero blocco HTML sarà un nodo di testo grande. Il wrapping in CDATA dice al parser XML di non analizzare quella sezione. Potrebbe essere "più facile", ma limita le tue capacità di downrange e dovrebbe essere impiegato solo quando appropriato; non solo perché è più conveniente. Escaped markup is considered harmful.

+1

HTML non è necessariamente XML valido (ad esempio, HTML non richiede tag di chiusura). Si assomigliano perché condividono SGML come loro antenato comune. L'unica opzione è davvero di scappare dai dati, o usare cdata. In caso contrario, il parser XML si arresterà in modo anomalo quando rileva il markup non valido. –

3

Se si utilizza CDATA, è necessario decodificarlo correttamente (textContent, value e innerHTML sono metodi che NON restituiscono i dati corretti).

diciamo che si utilizza una struttura XML simile a questo:

<response> 
    <command method="setcontent"> 
     <fieldname>flagOK</fieldname> 
     <content>479</content> 
    </command> 
    <command method="setcontent"> 
     <fieldname>htmlOutput</fieldname> 
     <content> 
      <![CDATA[ 
      <tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.7242,-50.2352</a></td></tr> 
      ]]> 
     </content> 
    </command> 
</response> 

in javascript, allora si avrà decodificare caricando il xml (jquery, per esempio) in una variabile come xmlDoc qui sotto e quindi ottenere la nodeValue per il 2 ° avvenimento (item(1)) del tag content

xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue 

o (entrambe le notazioni sono equivalenti)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue