Frage

Ich erstelle einige XML-Dokumente, und wenn es um den Adressteil geht, habe ich Fragmente, die so aussehen:

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

Das XSLT, das ich zum Konvertieren in XHTML habe, verfügt über eine seltsame rekursive Vorlage, um Zeilenumbrüche in Zeichenfolgen in <br/>-Tags umzuwandeln.

Das alles funktioniert gut;Aber gilt es als „schlechte Praxis“, sich in XML-Dokumenten auf Zeilenumbrüche zu verlassen?Wenn ja, wird empfohlen, stattdessen dies zu tun?

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

Scheint, als wäre es wirklich umständlich, jede Stelle, an der mein Text aus mehreren Zeilen besteht, mit solchen Tags zu umschließen.

War es hilfreich?

Lösung

Es wird im Allgemeinen als schlechte Praxis angesehen, sich auf Zeilenumbrüche zu verlassen, da dies eine fragile Methode zur Unterscheidung von Daten darstellt.Während die meisten XML-Prozessoren alle Leerzeichen, die Sie in Ihr XML einfügen, beibehalten, ist dies nicht garantiert.

Das eigentliche Problem besteht darin, dass die meisten Anwendungen, die Ihr XML in ein lesbares Format ausgeben, alle Leerzeichen in einem XML als austauschbar betrachten und diese Zeilenumbrüche möglicherweise in einem einzigen Leerzeichen zusammenfassen.Aus diesem Grund muss Ihr XSLT solche Hürden überwinden, um die Daten richtig darzustellen.Die Verwendung eines „br“-Tags würde die Transformation erheblich vereinfachen.

Ein weiteres potenzielles Problem besteht darin, dass die Zeilenumbrüche wahrscheinlich verloren gehen, wenn Sie Ihr XML-Dokument in einem XML-Editor öffnen und ausdrucken.

Wenn Sie LineBreaks weiterhin verwenden, stellen Sie sicher, dass ein XML: Space = "Attribut" zu "Adresse" erhalten. (Sie können dies in Ihrem DTD tun, wenn Sie einen verwenden.)

Einige empfahlen die Lektüre

XML -Anwendungen scheinen oft eine kavalierende Haltung gegenüber Whitespace zu nehmen, da die Regeln für die Orte in einem XML -Dokument, in dem Whitespace keine Rolle spielt, diese Anwendungen manchmal kostenlos zur Verfügung stellen, um Whitespace an bestimmten Orten hinzuzufügen oder zu entfernen.

Andere Tipps

Nur wenige Leute haben gesagt, dass CDATA-Blöcke es Ihnen ermöglichen, Zeilenumbrüche beizubehalten.Das ist falsch.CDATA-Abschnitte bewirken nur, dass Markups als Zeichendaten verarbeitet werden nicht Zeilenumbruchverarbeitung ändern.

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

ist genau das gleiche wie

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

Der einzige Unterschied besteht darin, wie verschiedene APIs dies melden.

Ich denke, das einzige wirkliche Problem besteht darin, dass das XML dadurch schwerer lesbar wird.z.B.

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

Wenn hübsches XML kein Problem darstellt, würde ich mir wahrscheinlich keine Sorgen darüber machen, solange es funktioniert.Wenn hübsches XML ein Problem darstellt, würde ich die expliziten Zeilenumbrüche in konvertieren <br /> Tags bzw \n bevor Sie sie in das XML einbetten.

Wie wäre es mit der Verwendung von Attributen zum Speichern der Daten anstelle von Textknoten:

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

Ich kenne die Verwendung von Attributen vs.Textknoten sind ein oft diskutiertes Thema, aber ich bin in 95 % der Fälle bei Attributen geblieben und hatte deswegen keine Probleme.

Es hängt davon ab, wie Sie das XML lesen und schreiben.

Wenn XML automatisch generiert wird – ob Zeilenumbrüche oder explizit Flags werden analysiert
- Dann gibt es keinen Grund zur Sorge.Ihre Eingabe enthält wahrscheinlich kein anderes XML, daher ist es einfacher, sich überhaupt nicht mit XML herumzuschlagen.

Wenn Sie manuell mit Tags arbeiten, ist es meiner Meinung nach immer noch sauberer, nur einen Zeilenumbruch vorzunehmen.

Die Ausnahme besteht, wenn Sie DOM verwenden, um eine gewisse Struktur aus dem XML herauszuholen.In diesem Fall sind Zeilenumbrüche offensichtlich böse, weil sie die Hierarchie nicht richtig darstellen.Es hört sich jedoch so an, als wäre die Hierarchie für Ihre Anwendung irrelevant, daher klingen Zeilenumbrüche ausreichend.

Wenn das XML einfach schlecht aussieht (insbesondere wenn es automatisch generiert wird), Ordentlich kann helfen, obwohl es mit HTML besser funktioniert als mit XML.

Dies ist wahrscheinlich ein etwas irreführendes Beispiel, da die Adresse in diesem Fall etwas nicht normalisiert ist.Dies ist jedoch ein vernünftiger Kompromiss, da Adressfelder schwer zu normalisieren sind.Wenn Sie dafür sorgen, dass die Zeilenumbrüche wichtige Informationen enthalten, führen Sie zu einer Denormalisierung und veranlassen die Post, die Bedeutung des Zeilenumbruchs zu interpretieren.

Ich würde sagen, dass dies normalerweise kein großes Problem darstellt, aber in diesem Fall denke ich, dass das Line-Tag am korrektesten ist, da es explizit zeigt, dass Sie nicht wirklich interpretieren, was die Linien in verschiedenen Kulturen bedeuten können.(Denken Sie daran, dass die meisten Formulare zur Eingabe einer Adresse eine Postleitzahl usw. sowie die Adresszeilen 1 und 2 enthalten.)

Die Unbeholfenheit, die das Vorhandensein des Zeilen-Tags mit normalem XML mit sich bringt, wurde bei Coding Horror viel diskutiert. http://www.codinghorror.com/blog/archives/001139.html

Die XML-Spezifikation hat dazu etwas zu sagen Leerzeichen Und Insbesondere Zeilenvorschübe und Wagenrückläufe.Wenn Sie sich also auf echte Zeilenumbrüche (x0A) beschränken, ist das kein Problem.Allerdings formatieren viele Bearbeitungstools XML für eine „bessere Darstellung“ neu und entfernen möglicherweise die spezielle Syntax.Ein robusterer und saubererer Ansatz als die „< line>< / line>“-Idee wäre, einfach Namespaces zu verwenden und XHTML-Inhalte einzubetten, z. B.:

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

Wenn es um Standardvokabeln geht, muss man das Rad nicht neu erfinden.

Ich verstehe nicht, was daran falsch ist <Line> Stichworte.
Anscheinend ist Ihnen die Visualisierung der Daten wichtig, wichtig genug, um sie in Ihren Daten zu behalten (durch Zeilenumbrüche in Ihrem ersten Beispiel).Bußgeld.Dann behalten Sie es wirklich, verlassen Sie sich nicht auf „Magie“, um es für Sie zu behalten.Behalten Sie alle Datenbits, die Sie später benötigen und die Sie aus dem gespeicherten Teil der Daten nicht perfekt ableiten können. Behalten Sie sie auch dann, wenn es sich um Visualisierungsdaten handelt (Zeilenumbrüche und andere Formatierungen).Ihr Benutzer (Endbenutzer eines anderen Entwicklers) hat sich die Zeit genommen, diese Daten nach seinen Wünschen zu formatieren – teilen Sie ihm entweder mit (API-Dokument/Text neben der Eingabe), dass Sie nicht beabsichtigen, sie zu behalten, oder – behalten Sie sie einfach.

Ja, ich denke, mit a CDATA block würde das Leerzeichen schützen.Obwohl einige Parser-APIs die Beibehaltung von Leerzeichen ermöglichen.

Was Sie wirklich tun sollten, ist, Ihr XML in ein Format zu konvertieren, das Leerzeichen beibehält.

Anstatt also zu versuchen, durch <br /> zu ersetzen, sollten Sie den gesamten Block in ein <pre> einschließen

Auf diese Weise bleibt Ihre Adresse funktionell erhalten (unabhängig davon, ob Sie Zeilenumbrüche einschließen oder nicht) und die XSTL kann entscheiden, ob Leerzeichen im Ergebnis beibehalten werden sollen.

Ich empfehle Ihnen, entweder das hinzuzufügen <br/> Zeilenumbrüche oder vielleicht eine Zeilenumbruch-Entität verwenden - &#x000D;

Wenn Sie möchten, dass Ihre Zeilenumbrüche erhalten bleiben, verwenden Sie einen CDATA-Block, z Tweakt sagte

Ansonsten Vorsicht.Meistens werden die Zeilenumbrüche von XML-Software beibehalten, aber manchmal ist das nicht der Fall, und Sie möchten sich wirklich nicht auf Dinge verlassen, die nur durch Zufall funktionieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top