解析包含“”的XML字符串(必须保留)

时间:2010-05-04 10:30:30

标签: .net-2.0 xml-parsing

我的代码传递了包含XML的string。此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;]" />

2 个答案:

答案 0 :(得分:2)

如果要保留它,则需要对其进行双重编码:&amp;#x20;。 XML阅读器翻译实体,这或多或少是XML的工作方式。

答案 1 :(得分:1)

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

我上面所做的更换为“&amp;”用“&amp;#x26;”从而逃脱了&符号。