wake-up-neo.com

Wie speichert man Zeilenumbrüche im XML-Attribut?

Ich muss Inhalte speichern, die Zeilenumbrüche in einigen XML-Attributen enthalten, nicht Text. Die Methode sollte so ausgewählt werden, dass ich sie in XSLT 1.0/ESXLT/XSLT 2.0 dekodieren kann

Was ist die beste Kodierungsmethode? 

Bitte schlagen Sie einige Ideen vor.

55
Tommy

In einer kompatiblen DOM-API müssen Sie nichts tun. Speichern Sie einfach die Zeilenumbrüche in das Attribut. Die API codiert sie selbstständig korrekt (siehe Canonical XML spec, Abschnitt 5.2 ).

Wenn Sie Ihre eigene Codierung vornehmen (d. H. \n durch 
 ersetzen, bevor Sie den Attributwert speichern), codiert die API Ihre Eingabe erneut, wodurch 
 in der XML-Datei angezeigt wird.

In der unteren Zeile wird der Stringwert wörtlich gespeichert. Sie bekommen heraus, was Sie einsetzen, ohne dass Sie eingreifen müssen. 

Allerdings… sind einige Implementierungen nicht kompatibel. Beispielsweise kodieren sie &-Zeichen in Attributwerten, vergessen jedoch Zeilenumbrüche oder Registerkarten. Dies führt zu einer Verlustposition, da Sie Zeilenumbrüche nicht einfach durch 
 ersetzen können. 

Bei diesen Implementierungen werden Zeilenumbrüche wie folgt gespeichert:

<xml attribute="line 1
line 2" />

Beim Parsen eines solchen Dokuments werden buchstäbliche Zeilenumbrüche in Attributen (wieder entsprechend der Spezifikation) in einen einzigen Bereich normiert - und gehen somit verloren.

Das Speichern (und Beibehalten!) Von Zeilenumbrüchen in Attributen ist in diesen Implementierungen nicht möglich. 

68
Tomalak

Sie können die Entität &#10; verwenden, um eine neue Zeile in einem XML-Attribut darzustellen. &#13; kann zur Darstellung eines Wagenrücklaufs verwendet werden. Eine CRLF im Windows-Stil könnte als &#13;&#10; dargestellt werden.

Dies ist eine legale XML-Syntax. Siehe XML ​​spec für weitere Details.

41
Asaph

Ein etwas anderer Ansatz, der in einigen Situationen hilfreich war -

Platzhalter und Ersetzen suchen.

Vor dem Parsen können Sie einfach Ihren eigenen benutzerdefinierten Zeilenumbruch-Marker/Platzhalter verwenden. In der zweiten Hälfte der Situation ersetzen Sie ihn einfach durch das jeweils gültige Zeilenumbruch-Zeichen, unabhängig davon, ob dies\n oder\n ist.

 oder # 13; oder # 10; oder\u2028 oder eines der verschiedenen Zeilenumbruchzeichen da draußen. Ersetzen Sie sie wieder, nachdem Sie den Platzhalter in den Daten festgelegt haben.

Dies ist nützlich, wenn Parser wie jQuery $ .parseXML () die nicht codierten Zeilenumbrüche entfernen. Beispielsweise könnten Sie {LBREAK} als Zeilenumbruchzeichen verwenden, es in Rohtext einfügen und es später nach dem Parsen in ein XML-Objekt ersetzen. String.replaceAll () ist ein hilfreicher Prototyp.

function onXMLHandleLineBreaks(_result){
    var lineBreakCharacterThatGetsLost = '&#10;';
    var lineBreakCharacterThatGetsLost = '&#xD;';
    var rawXMLText = _result; // hold as text only until line breaks are ready
        rawXMLText = String(rawXMLText).replaceAll(lineBreakCharacterThatGetsLost, '{mylinebreakmarker}'); // placemark the linebreaks with a regex find and replace proto
    var xmlObj = $.parseXML(rawXML); // to xml obj
    $(xmlObj).html( String(xmlObj.html()).replaceAll('{mylinebreakmarker}'), lineBreakCharacterThatWorks ); // add back in line breaks
    console.log('xml with linebreaks that work: ' + xmlObj);
}
.

0
OG Sean

Eine grobe Antwort kann sein:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"Agenda.xml");
//make stuff with the xml
//make attributes value = "\r\n" (you need both expressions to make a new line)
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r    \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();

Dieser Wille ist, wie Sie sehen, nur eine Zeichenfolge

0
rosca dragos