web-dev-qa-db-ja.com

XML属性で改行を保存する方法は?

テキストではなく、いくつかのXML属性に改行を含むコンテンツを保存する必要があります。 XSLT 1.0/ESXLT/XSLT 2.0でデコードできるように、メソッドを選択する必要があります

最適なエンコード方法は何ですか?

提案/提案してください。

56
Tommy

準拠したDOM APIでは、何もする必要はありません。実際の改行文字を属性に保存するだけで、APIはそれらを独自に正しくエンコードします( Canonical XML spec、section 5.2 を参照)。

独自のエンコードを行う(つまり、属性値を保存する前に_\n_を_
_に置き換える)と、APIは入力againをエンコードし、結果として_
_ XMLファイル。

要するに、文字列値はそのまま保存されます。差し込むものを取り出すので、干渉する必要はありません。

ただし、...一部の実装は準拠していません。たとえば、属性値に_&_文字をエンコードしますが、改行文字またはタブは忘れます。事前に単純に改行を_
_に置き換えることはできないため、これは負けの立場になります。

これらの実装は、次のように改行文字をエンコードせずに保存します。

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

そのようなドキュメントを解析すると、属性のリテラル改行が単一のスペースに正規化されます(再び、仕様に従って)。したがって、それらは失われます。

これらの実装では、属性の改行を保存(および保持)することは不可能です。

71
Tomalak

エンティティ&#10;を使用して、XML属性の改行を表すことができます。 &#13;は、キャリッジリターンを表すために使用できます。 WindowsスタイルのCRLFは&#13;&#10;として表すことができます。

これは正当なXML構文です。詳細については、 XML spec を参照してください。

41
Asaph

一部の状況で役立つわずかに異なるアプローチ-

プレースホルダーと検索置換。

解析する前に、独自のカスタム改行マーカー/プレースホルダーを使用することができます。その後、状況の後半で、\ nであろうと、.

 または#13;または#10;または\ u2028またはさまざまな改行文字がそこにあります。最初にデータに独自のプレースホルダーを設定した後、それらを元に戻します。

これは、jQuery $ .parseXML()などのパーサーがエンコードされていない改行を取り除くときに便利です。たとえば、{LBREAK}を改行文字として使用し、生のテキストの間に挿入し、XMLオブジェクトに解析された後で後で置き換えることができます。 String.replaceAll()は便利なプロトタイプです。

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

おおまかな答えは次のとおりです。

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();

あなたが見るように、これは単なる文字列です

0
rosca dragos