7

この質問によると:

XML 属性値の改行は許可されていますか?

XML 属性の改行は完全に有効です (ただし、推奨されない可能性があります)。

<xmltag1>
    <xmltag2 attrib="line 1
line 2
line 3">
    </xmltag2>
</xmltag1>

LINQ to XML ( System.Xml.Linq) を使用してそのような XML を解析すると、これらの改行はサイレントに空白' '文字に変換されます。

XDocument.Load()これらの改行を保持するようにパーサーに指示する方法はありますか?

PS: 解析中の XML はサードパーティ ソフトウェアによって記述されているため、改行の記述方法を変更することはできません。

4

3 に答える 3

8

属性値の改行を保持したい場合は、文字参照を使用してそれらを記述する必要があります。

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/>

それ以外の場合、XML パーサーは XML 仕様http://www.w3.org/TR/xml/#AVNormalizeに従ってスペースに正規化します。

[編集] 属性値の正規化を回避したい場合は、レガシーで XML をロードすることがXmlTextReader役立ちます。

            string testXml = @"<foo bar=""Line 1.
Line 2.
Line 3.""/>";

            XDocument test;
            using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml)))
            {
                xtr.Normalization = false;
                test = XDocument.Load(xtr);
            }
            Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value);

その出力

|Line 1.
Line 2.
Line 3.|
于 2012-07-13T08:42:33.467 に答える
1

MSDNによると:

XML プロセッサは、要素のコンテンツ内のすべての空白を保持しますが、属性値で正規化することがよくあります。タブ、キャリッジ リターン、およびスペースは、単一のスペースとして報告されます。特定の種類の属性では、値の本体の前後にある空白を削除し、値内の空白を 1 つのスペースに減らします。(DTD が使用可能な場合、このトリミングは CDATA 型ではないすべての属性に対して実行されます。)

たとえば、XML ドキュメントには次のものが含まれる場合があります。

<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">

XML パーサーは、"this is a note."改行を単一スペースに変換して、両方の属性値を として報告します。

属性の空白を保持することについては何も見つかりませんが、この説明によると不可能かもしれません。

于 2012-07-13T09:16:47.543 に答える
0

改行は解析時にスペースではありません (ASCII コード 32 ではありません)。各文字をステップ実行すると、「スペース ' '」が ASCII コードであることがわかります 10 =LF(LineFeed)(!!) - したがって、改行はまだコード内でそれらをASCII 13に置き換えようとする必要がある場合に存在します...(テキストボックス(Windowsフォーム)は改行としてLFを表示しません)

于 2012-07-13T08:51:17.897 に答える