Schreiben von XML mit höchstens zwei Tags pro Zeile

8

Ich speichere XML von .NET XElement. Ich habe die Methode ToString verwendet, aber die Formatierung sieht nicht so aus, wie ich es möchte (Beispiele unten). Ich hätte höchstens zwei Tags pro Zeile. Wie kann ich das erreichen?

Das Speichern von XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString() gibt mir

%Vor%

Aber zur besseren Lesbarkeit würde ich lieber "drei", "vier" und "fünf" auf getrennten Zeilen stehen:

%Vor%

Edit: Ja, ich verstehe das syntaktisch anders und "nicht im Sinne von XML", aber ich bin pragmatisch. Kürzlich habe ich Megabyte-große xml-Dateien mit nur 3 Zeilen gesehen - das ist eine Herausforderung für Texteditoren, Quellcodeverwaltung und Diff-Tools. Etwas muss getan werden! Ich habe getestet, dass das Ändern der obigen Formatierung mit unserer Anwendung kompatibel ist.

    
Colonel Panic 16.10.2012, 10:38
quelle

5 Antworten

3

Begründete Gründe für Kollegen - wir werden das Dateiformat ändern. Ich empfehle Ihnen, das gleiche zu versuchen. Es ist nahezu unmöglich, das zu tun, was ich wollte, denn die meisten xml-Tools gehen davon aus, dass Leerräume signifikant sind.

    
Colonel Panic 18.04.2013, 17:12
quelle
13

Wenn Sie genau diese Ausgabe wünschen, müssen Sie dies manuell tun, indem Sie nach Bedarf Leerzeichen um Knoten hinzufügen.

Fast alle Leerzeichen in XML-Dokumenten sind signifikant, auch wenn wir sie nur als Einzüge betrachten. Wenn wir den Serializer bitten, das Dokument für uns einzurücken, nimmt es Änderungen am Inhalt vor, der extrahiert werden kann, also versuchen sie, so konservativ wie möglich zu sein. Die Elemente

%Vor%

und

%Vor%

hat einen anderen Inhalt, und wenn ein Serializer den ersten in den zweiten geändert hat, würde er das ändern, was Sie von Ihrer XML-API erhalten, wenn Sie nach dem Inhalt von <tag> fragen.

Die übliche Faustregel ist, dass keine Einrückung angewendet wird, wenn zwischen den Elementen ein Nicht-Whitespace vorhanden ist. In diesem Fall würde Ihr three zwischen den Tags geändert, wenn ein Serializer die von Ihnen gewünschte Einrückung anwendet, sodass nichts automatisch für Sie erledigt wird.

Wenn Sie Kontrolle über das XML-Format haben, ist es nicht ratsam, Element- und Text-Kinder wie folgt zu mischen, wobei <b> sowohl Text- ( three ) als auch Element- ( <c> ) Kinder hat, da es Probleme wie was verursacht du siehst.

    
Jason Viers 11.11.2012 19:53
quelle
3

Die Formatierung funktioniert wegen der nackten "Drei" nicht wie gewünscht. Gibt es einen Grund, warum es nicht in einem eigenen Tag ist? Sollte es stattdessen ein Attribut von "b" sein?

    
David Peden 11.11.2012 19:15
quelle
2

XML ist ein Format für den Informationsaustausch, das für Computer gedacht ist. Der Leerraum ist irrelevant (abhängig von Ort und Schema) und daher wäre es beliebig, das eine oder das andere zu verwenden.

Sie könnten XmlTextWriter mit XElement.Save und sehen Sie, ob Sie es mit der XmlWriter.Settings-Eigenschaft

    
sehe 16.10.2012 11:02
quelle
0

Ich musste etwas Ähnliches vorher machen (für eine Kundenanfrage). Alles, was ich am Ende getan habe, war eine benutzerdefinierte .ToString () -Methode zu schreiben, die nur für die Anzeige der XML in einem Browser (hm, ich weiß) oder für ihre Verwendung beim Herunterladen einer XML-Datei des Inhalts verwendet wird. Da der Code nicht recheneffizient sein musste, ging es nur darum, die untergeordneten Elemente der einzelnen Tags zu überprüfen und den "hängenden" Text als solchen anzuordnen.

Schließlich konnten wir den Benutzer davon überzeugen, dass der Text stattdessen ein Attribut sein sollte.

    
Jason M 23.04.2013 21:47
quelle

Tags und Links