Est-ce une « mauvaise pratique » d'être sensible aux sauts de ligne dans les documents XML ?

StackOverflow https://stackoverflow.com/questions/7277

Question

Je génère des documents XML et en ce qui concerne la partie adresse, j'ai des fragments qui ressemblent à ceci :

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

Le XSLT que j'ai pour convertir ceci en XHTML a un modèle récursif génial pour convertir les caractères de nouvelle ligne dans les chaînes en balises <br/>.

Tout fonctionne bien ;mais est-il considéré comme une « mauvaise pratique » de s'appuyer sur des sauts de ligne dans les documents XML ?Si oui, est-il recommandé de le faire à la place ?

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

On dirait qu'il serait vraiment gênant d'envelopper chaque endroit où mon texte peut comporter plusieurs lignes avec des balises comme celle-là.

Était-ce utile?

La solution

Il est généralement considéré comme une mauvaise pratique de s'appuyer sur des sauts de ligne, car il s'agit d'un moyen fragile de différencier les données.Bien que la plupart des processeurs XML conservent tous les espaces que vous insérez dans votre XML, cela n'est pas garanti.

Le vrai problème est que la plupart des applications qui génèrent votre XML dans un format lisible considèrent tous les espaces d'un XML comme interchangeables et peuvent réduire ces sauts de ligne en un seul espace.C'est pourquoi votre XSLT doit franchir de tels obstacles pour restituer correctement les données.L'utilisation d'une balise "br" simplifierait considérablement la transformation.

Un autre problème potentiel est que si vous ouvrez votre document XML dans un éditeur XML et que vous l'imprimez joliment, vous risquez de perdre ces sauts de ligne.

Si vous continuez à utiliser des sauts de ligne, assurez-vous d’ajouter un attribut xml :space="preserve » à « address ». (Vous pouvez le faire dans votre DTD, si vous en utilisez une.)

Certains ont suggéré de lire

Les applications XML semblent souvent prendre un Attitude cavalière à l’égard des espaces blancs parce que les règles concernant les lieux dans un document XML où les espaces sont n’a pas d’importance donne parfois ces applications carte blanche pour ajouter ou Supprimez les espaces à certains endroits.

Autres conseils

Peu de gens ont dit que les blocs CDATA vous permettraient de conserver les sauts de ligne.C'est faux.Les sections CDATA feront uniquement traiter le balisage comme des données de caractères, elles le feront pas modifier le traitement des sauts de ligne.

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

est exactement le même que

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

La seule différence réside dans la manière dont les différentes API le signalent.

Je pense que le seul vrai problème est que cela rend le XML plus difficile à lire.par exemple.

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

Si le joli XML n'est pas un problème, je ne m'en inquiéterais probablement pas, tant qu'il fonctionne.Si le joli XML est un problème, je convertirais les nouvelles lignes explicites en <br /> des balises ou \n avant de les intégrer dans le XML.

Qu'en est-il de l'utilisation d'attributs pour stocker les données, plutôt que de nœuds de texte :

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

Je connais l'utilisation des attributs vs.les nœuds de texte sont un sujet souvent débattu, mais je suis resté fidèle aux attributs 95% du temps et je n'ai eu aucun problème à cause de cela.

Cela dépend de la façon dont vous lisez et écrivez le XML.

Si XML est généré automatiquement - si nouvelles lignes ou explicite les drapeaux sont analysés
- alors il n'y a pas de quoi s'inquiéter.Votre entrée ne contient probablement aucun autre XML, il est donc tout simplement plus propre de ne pas jouer du tout avec XML.

Si les balises sont utilisées manuellement, il est toujours plus propre d'avoir simplement un saut de ligne, si vous me le demandez.

L'exception est si vous utilisez DOM pour extraire une structure du XML.Dans ce cas, les sauts de ligne sont évidemment mauvais car ils ne représentent pas correctement la hiérarchie.Il semble que la hiérarchie ne soit pas pertinente pour votre application, donc les sauts de ligne semblent suffisants.

Si le XML semble mauvais (surtout lorsqu'il est généré automatiquement), Rangé peut aider, même si cela fonctionne mieux avec HTML qu'avec XML.

C'est probablement un exemple un peu trompeur, puisque l'adresse est un peu non normalisée dans ce cas.Il s'agit toutefois d'un compromis raisonnable, car les champs d'adresse sont difficiles à normaliser.Si vous faites en sorte que les sauts de ligne contiennent des informations importantes, vous ne normalisez pas et obligez le bureau de poste à interpréter la signification du saut de ligne.

Je dirais que normalement ce n'est pas un gros problème, mais dans ce cas, je pense que la balise Line est la plus correcte car elle montre explicitement que vous n'interprétez pas réellement ce que les lignes peuvent signifier dans différentes cultures.(N'oubliez pas que la plupart des formulaires permettant de saisir une adresse comportent un code postal, etc., ainsi que les lignes d'adresse 1 et 2.)

La difficulté d'avoir la balise de ligne est fournie avec le XML normal et a été beaucoup débattue lors du codage de l'horreur. http://www.codinghorror.com/blog/archives/001139.html

La spécification XML a quelque chose à dire concernant espace et notamment les sauts de ligne et les retours chariot.Donc, si vous vous limitez aux vrais sauts de ligne (x0A), ça devrait aller.Cependant, de nombreux outils d'édition reformateront le XML pour une « meilleure présentation » et supprimeront éventuellement la syntaxe spéciale.Une approche plus robuste et plus propre que l'idée "< line>< / line>" serait d'utiliser simplement des espaces de noms et d'intégrer du contenu XHTML, par exemple :

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

Pas besoin de réinventer la roue en matière de vocabulaires standards.

Je ne vois pas ce qui ne va pas <Line> Mots clés.
Apparemment, la visualisation des données est importante pour vous, suffisamment importante pour la conserver dans vos données (via des sauts de ligne dans votre premier exemple).Bien.Alors gardez-le vraiment, ne comptez pas sur la « magie » pour le garder pour vous.Conservez toutes les données dont vous aurez besoin plus tard et que vous ne pouvez pas déduire parfaitement de la partie enregistrée des données, conservez-les même s'il s'agit de données de visualisation (sauts de ligne et autres formats).Votre utilisateur (utilisateur final d'un autre développeur) a pris le temps de formater ces données à sa guise - soit dites-lui (document API/texte à côté de l'entrée) que vous n'avez pas l'intention de les conserver, soit - conservez-les simplement.

Oui, je pense qu'en utilisant un DONNÉES CD le bloc protégerait les espaces.Bien que certaines API d'analyseur vous permettent de conserver les espaces.

Ce que vous devriez vraiment faire, c'est convertir votre XML dans un format qui préserve les espaces.

Donc, plutôt que de chercher à remplacer par <br /> vous devriez envelopper le bloc entier dans un <pre>

De cette façon, votre adresse est fonctionnellement préservée (que vous incluiez ou non des sauts de ligne) et le XSTL peut choisir de conserver les espaces dans le résultat.

Je vous recommande soit d'ajouter le <br/> des sauts de ligne ou peut-être utiliser une entité de saut de ligne - &#x000D;

Si vous avez besoin de conserver vos sauts de ligne, utilisez un bloc CDATA, comme tweak a dit

Sinon méfiez-vous.La plupart du temps, les sauts de ligne seront conservés par le logiciel XML, mais parfois ils ne le seront pas, et vous ne voulez vraiment pas vous fier à des choses qui ne fonctionnent que par coïncidence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top