Domanda

Sto generando alcuni documenti XML e quando si tratta della parte dell'indirizzo ho frammenti simili a questi:

<Address>15 Sample St
Example Bay
Some Country</Address>

L'XSLT che ho per convertirlo in XHTML ha un modello ricorsivo originale per convertire i caratteri di nuova riga all'interno delle stringhe in tag <br/>.

Funziona tutto bene;ma è considerata una "cattiva pratica" fare affidamento sulle interruzioni di riga all'interno dei documenti XML?Se sì, è consigliabile farlo invece?

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

Sembra che sarebbe davvero imbarazzante racchiudere ogni punto in cui il mio testo potrebbe essere composto da più righe con tag del genere..

È stato utile?

Soluzione

È generalmente considerata una cattiva pratica fare affidamento sulle interruzioni di riga, poiché è un modo fragile per differenziare i dati.Sebbene la maggior parte dei processori XML conserverà tutti gli spazi bianchi inseriti nel tuo XML, ciò non è garantito.

Il vero problema è che la maggior parte delle applicazioni che restituiscono il tuo XML in un formato leggibile considerano intercambiabili tutti gli spazi bianchi in un XML e potrebbero comprimere tali interruzioni di riga in un unico spazio.Ecco perché il tuo XSLT deve passare attraverso questi passaggi per eseguire correttamente il rendering dei dati.L'utilizzo di un tag "br" semplificherebbe notevolmente la trasformazione.

Un altro potenziale problema è che se apri il tuo documento XML in un editor XML e lo stampi in modo carino, probabilmente perderai quelle interruzioni di riga.

Se continui a usare Linebreaks, assicurati di aggiungere un attributo XML: Space = "Preserve" a "Indirizzo". (Puoi farlo nel tuo DTD, se ne stai usando uno.)

Alcuni suggerivano la lettura

Le applicazioni XML sembrano spesso assumere un atteggiamento cavaliere nei confronti dello spazio bianco perché le regole sui luoghi in un documento XML in cui lo spazio bianco a volte non importa dà a queste applicazioni frenetiche per aggiungere o rimuovere lo spazio bianco in determinati luoghi.

Altri suggerimenti

Poche persone hanno detto che i blocchi CDATA ti permetteranno di mantenere le interruzioni di riga.Questo è sbagliato.Le sezioni CDATA faranno sì che il markup venga elaborato solo come dati di carattere, lo faranno non modificare l'elaborazione dell'interruzione di riga.

<Address>15 Sample St
Example Bay
Some Country</Address>

è esattamente lo stesso di

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

L'unica differenza è il modo in cui le diverse API lo segnalano.

Penso che l'unico vero problema sia che rende l'XML più difficile da leggere.per esempio.

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

Se il bel XML non è un problema, probabilmente non me ne preoccuperei, purché funzioni.Se il bel XML è un problema, convertirei i ritorni a capo espliciti in <br /> tag o \n prima di incorporarli nell'XML.

Che ne dici di utilizzare gli attributi per memorizzare i dati, anziché i nodi di testo:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

Conosco l'uso degli attributi vs.i nodi di testo sono un argomento spesso dibattuto, ma mi sono limitato agli attributi il ​​95% delle volte e non ho avuto problemi a causa di ciò.

Dipende da come stai leggendo e scrivendo l'XML.

Se XML viene generato automaticamente, se newline o esplicito vengono analizzati i flag
- allora non c'è niente di cui preoccuparsi.Probabilmente il tuo input non contiene nessun altro XML, quindi è semplicemente più pulito non scherzare affatto con XML.

Se i tag vengono elaborati manualmente, è ancora più pulito avere semplicemente un'interruzione di riga, se me lo chiedi.

L'eccezione è se stai utilizzando DOM per ottenere una struttura dall'XML.In tal caso le interruzioni di riga sono ovviamente dannose perché non rappresentano correttamente la gerarchia.Tuttavia, sembra che la gerarchia sia irrilevante per la tua applicazione, quindi le interruzioni di riga sembrano sufficienti.

Se l'XML sembra semplicemente pessimo (specialmente se generato automaticamente), Ordinato può aiutare, anche se funziona meglio con HTML che con XML.

Questo è probabilmente un esempio un po' ingannevole, poiché in questo caso l'indirizzo è un po' non normalizzato.Si tratta tuttavia di un compromesso ragionevole poiché i campi indirizzo sono difficili da normalizzare.Se fai in modo che le interruzioni di riga contengano informazioni importanti, stai non-normalizzando e facendo in modo che l'ufficio postale interpreti il ​​significato dell'interruzione di riga.

Direi che normalmente questo non è un grosso problema, ma in questo caso penso che il tag Line sia più corretto poiché mostra esplicitamente che in realtà non si interpreta ciò che le linee possono significare nelle diverse culture.(Ricorda che la maggior parte dei moduli per l'inserimento di un indirizzo hanno il codice postale, ecc. e le righe dell'indirizzo 1 e 2.)

L'imbarazzo di avere il tag line deriva dal normale XML ed è stato molto dibattuto nella codifica dell'horror. http://www.codinghorror.com/blog/archives/001139.html

Le specifiche XML hanno qualcosa da dire al riguardo spazi bianchi E in particolare gli avanzamenti di riga e i ritorni a capo.Quindi se ti limiti ai veri avanzamenti di riga (x0A) dovresti essere Ok.Tuttavia, molti strumenti di modifica riformatteranno XML per una "presentazione migliore" e probabilmente elimineranno la sintassi speciale.Un approccio più robusto e più pulito rispetto all'idea "< line>< / line>" sarebbe quello di utilizzare semplicemente gli spazi dei nomi e incorporare contenuto XHTML, ad esempio:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

Non c'è bisogno di reinventare la ruota quando si tratta di vocabolari standard.

Non vedo cosa c'è che non va <Line> tag.
Apparentemente, la visualizzazione dei dati è importante per te, abbastanza importante da mantenerla nei tuoi dati (tramite interruzioni di riga nel tuo primo esempio).Bene.Allora tienilo davvero, non fare affidamento sulla "magia" per tenerlo per te.Conserva tutti i dati di cui avrai bisogno in seguito e che non puoi dedurre perfettamente dalla parte salvata dei dati, conservali anche se si tratta di dati di visualizzazione (interruzioni di riga e altra formattazione).Il tuo utente (utente finale di un altro sviluppatore) si è preso il tempo di formattare i dati a suo piacimento: digli (documento API/testo vicino all'input) che non intendi conservarli oppure semplicemente conservali.

Sì, penso che usare a CDATA block proteggerebbe lo spazio bianco.Sebbene alcune API parser ti consentano di preservare gli spazi bianchi.

Quello che dovresti veramente fare è convertire il tuo XML in un formato che preservi gli spazi bianchi.

Quindi invece di cercare di sostituire con <br /> dovresti racchiudere l'intero blocco in un <pre>

In questo modo, il tuo indirizzo viene preservato funzionalmente (indipendentemente dal fatto che includi o meno interruzioni di riga) e XSTL può scegliere se preservare gli spazi bianchi nel risultato.

Ti consiglio di aggiungere il file <br/> interruzioni di riga o magari utilizzare l'entità di interruzione di riga - &#x000D;

Se hai bisogno che le tue interruzioni di riga siano preservate, usa un blocco CDATA, come modificare ha detto

Altrimenti attenzione.Nella maggior parte dei casi, le interruzioni di riga verranno preservate dal software XML, ma a volte no, e non vorrai davvero fare affidamento su cose che funzionano solo per coincidenza

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top