5

我有传递string包含 XML 的代码。此 XML 可能包含一个或多个 (空格字符的实体引用)的实例。我要求不应解析这些引用(即不应将它们替换为实际的空格字符)。

我有什么办法可以做到这一点?

基本上,给定一个包含 XML 的字符串:

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

希望它被转换为:

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

(我实际上想要实现的是简单地获取一个 XML 字符串并将其写入一个“漂亮打印”的文件。这具有将&#x20;字符串中的出现解析为单个空格字符的副作用,这需要保留。此要求的原因是编写的 XML 文档必须符合外部定义的规范。)

我已经尝试创建一个子类XmlTextReader来从 XML 字符串中读取并覆盖该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 回答