【发布时间】:2016-12-07 19:27:28
【问题描述】:
我正在尝试使用 XmlTextReader 加载 xml 内容,但由于某种原因,XmlTextReader 在处理 Xml 时忽略了 DtdProcessing 标志。如果我改用 XmlReader,则 DtdProcessing 标志工作正常。 XmlReader 的问题在于它会自动将 \r\n\ 标准化为 \n,这是我不想在输出字符串中出现的。
这是我的代码 sn-p:
XmlDocument xmlDocument = new XmlDocument();
string contents = @"<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>
<!DOCTYPE content [<!ENTITY ouml 'ö'>]>
<content>Test ö Test
Test</content>";
byte[] byteArray = Encoding.UTF8.GetBytes(contents);
MemoryStream stream = new MemoryStream(byteArray);
//XmlReaderSettings settings = new XmlReaderSettings();
//settings.DtdProcessing = DtdProcessing.Parse;
//settings.IgnoreWhitespace = false;
//XmlReader reader = XmlReader.Create(stream, settings);
//xmlDocument.Load(reader);
XmlTextReader reader = new XmlTextReader(stream);
reader.DtdProcessing = DtdProcessing.Parse;
xmlDocument.Load(reader);
Console.WriteLine(xmlDocument.OuterXml);
我从上面的处理中得到的输出:
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?><!DOCTYPE content[<!ENTITY ouml 'ö'>]><content>Test ö Test\r\n\r\n Test</content>"
相反,我想要处理 DTD 的输出字符串:
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?><!DOCTYPE content[<!ENTITY ouml 'ö'>]><content>Test ö Test\r\n\r\n Test</content>"
【问题讨论】:
-
你为什么关心序列化的 XML 的样子?只要定义了
ouml,文字ö和&ouml;之间就没有区别。 -
谢谢托马拉克。我确实希望在我的输出中使用文字
ö而不是&ouml;。我很感激任何指针。 -
我明白你想要什么。我在问为什么,因为这两个变体是等价的。
-
我们有一个传统的下游系统,它期望文字变体。我们能够通过 XmlReader 对象获取它,但它还有一些其他问题。
-
我已经在怀疑像 “我们有一个使用正则表达式来解析 XML 的下游应用程序”这样的可怕事情。嗯……这就是为什么唯一应该与 XML 交互的是 XML 解析器的原因。我不确定是否有任何常规方法可以解决此问题,但作为不得已的方法,您可以做同样可怕的事情,例如 "string-replace 所有出现的
&ouml;与ö在最终 XML字符串".
标签: c# xml dtd xmldocument xmltextreader