テキストではなく、いくつかのXML属性に改行を含むコンテンツを保存する必要があります。 XSLT 1.0/ESXLT/XSLT 2.0でデコードできるように、メソッドを選択する必要があります
最適なエンコード方法は何ですか?
提案/提案してください。
準拠したDOM APIでは、何もする必要はありません。実際の改行文字を属性に保存するだけで、APIはそれらを独自に正しくエンコードします( Canonical XML spec、section 5.2 を参照)。
独自のエンコードを行う(つまり、属性値を保存する前に_\n
_を_
_に置き換える)と、APIは入力againをエンコードし、結果として_

_ XMLファイル。
要するに、文字列値はそのまま保存されます。差し込むものを取り出すので、干渉する必要はありません。
ただし、...一部の実装は準拠していません。たとえば、属性値に_&
_文字をエンコードしますが、改行文字またはタブは忘れます。事前に単純に改行を_
_に置き換えることはできないため、これは負けの立場になります。
これらの実装は、次のように改行文字をエンコードせずに保存します。
_<xml attribute="line 1
line 2" />
_
そのようなドキュメントを解析すると、属性のリテラル改行が単一のスペースに正規化されます(再び、仕様に従って)。したがって、それらは失われます。
これらの実装では、属性の改行を保存(および保持)することは不可能です。
エンティティ
を使用して、XML属性の改行を表すことができます。
は、キャリッジリターンを表すために使用できます。 WindowsスタイルのCRLFは
として表すことができます。
これは正当なXML構文です。詳細については、 XML spec を参照してください。
一部の状況で役立つわずかに異なるアプローチ-
プレースホルダーと検索置換。
解析する前に、独自のカスタム改行マーカー/プレースホルダーを使用することができます。その後、状況の後半で、\ nであろうと、.
または#13;または#10;または\ u2028またはさまざまな改行文字がそこにあります。最初にデータに独自のプレースホルダーを設定した後、それらを元に戻します。
これは、jQuery $ .parseXML()などのパーサーがエンコードされていない改行を取り除くときに便利です。たとえば、{LBREAK}を改行文字として使用し、生のテキストの間に挿入し、XMLオブジェクトに解析された後で後で置き換えることができます。 String.replaceAll()は便利なプロトタイプです。
function onXMLHandleLineBreaks(_result){
var lineBreakCharacterThatGetsLost = ' ';
var lineBreakCharacterThatGetsLost = '
';
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);
}
.
おおまかな答えは次のとおりです。
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("
", "\r").Replace("
", "\n").Replace("><",">\r \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();
あなたが見るように、これは単なる文字列です