5

stringXMLを含むコードが渡されます。 このXMLには、 (空白文字のエンティティ参照)のインスタンスが1つ以上含まれている場合があります。これらの参照を解決しないようにする必要があります(つまり、実際のスペース文字に置き換えないでください)。

これを達成する方法はありますか?

基本的に、XMLを含む文字列が与えられた場合:

<pattern value="[A-Z0-9&#x20;]" />

私はそれを次のように変換したくありません:

<pattern value="[A-Z0-9 ]" />

(私が実際に達成しようとしているのは、XML文字列を取得して、それを「きれいに印刷された」ファイルに書き込むことです。これには&#x20;、文字列内の出現箇所を単一のスペース文字に解決するという副作用があります。この要件の理由は、記述されたXMLドキュメントが外部で定義された仕様に準拠している必要があるためです。)

XmlTextReaderXML文字列から読み取るサブクラスを作成してResolveEntity()メソッドをオーバーライドしようとしましたが、これは呼び出されません。カスタムを割り当ててみましたXmlResolver

また、提案されているように、「ダブルエンコード」を試みました。残念ながら、パーサーによってデコードされ&amp;ないため、これは望ましい効果をもたらしませんでした。これが私が使用したコードです:

string schemaText = @"...<pattern value=""[A-Z0-9&#x26;#x20;]"" />...";
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.Indent = true;
writerSettings.NewLineChars = Environment.NewLine;
writerSettings.Encoding = Encoding.Unicode;
writerSettings.CloseOutput = true;
writerSettings.OmitXmlDeclaration = false;
writerSettings.IndentChars = "\t";

StringBuilder writtenSchema = new StringBuilder();
using ( StringReader sr = new StringReader( schemaText ) )
using ( XmlReader reader = XmlReader.Create( sr ) )
using ( TextWriter tr = new StringWriter( writtenSchema ) )
using ( XmlWriter writer = XmlWriter.Create( tr, writerSettings ) )
{
   XPathDocument doc = new XPathDocument( reader );
   XPathNavigator nav = doc.CreateNavigator();

   nav.WriteSubtree( writer );
}

書かれたXMLは次のようになります。

<pattern value="[A-Z0-9&amp;#x20;]" />
4

2 に答える 2

2

保存したい場合は、二重にエンコードする必要があります: &amp;#x20;. XML リーダーエンティティを変換します。これは多かれ少なかれ XML のしくみです。

于 2010-05-04T10:32:38.087 に答える
1
<pattern value="[A-Z0-9&#x26;#x20;]" />

What I did above is replaced "&" with "&#x26;" thereby escaping the ampersand.

于 2010-05-04T10:33:50.730 に答える