【问题标题】:XmlTextReader is ignoring DtdProcessing flagXmlTextReader 忽略 DtdProcessing 标志
【发布时间】: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 '&#246;'>]>
    <content>Test &ouml; 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 '&#246;'>]><content>Test &ouml; Test\r\n\r\n    Test</content>"

相反,我想要处理 DTD 的输出字符串:

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?><!DOCTYPE content[<!ENTITY ouml '&#246;'>]><content>Test ö Test\r\n\r\n    Test</content>"

【问题讨论】:

  • 你为什么关心序列化的 XML 的样子?只要定义了ouml,文字ö&amp;ouml; 之间就没有区别。
  • 谢谢托马拉克。我确实希望在我的输出中使用文字 ö 而不是 &amp;ouml;。我很感激任何指针。
  • 我明白你想要什么。我在问为什么,因为这两个变体是等价的。
  • 我们有一个传统的下游系统,它期望文字变体。我们能够通过 XmlReader 对象获取它,但它还有一些其他问题。
  • 我已经在怀疑像 “我们有一个使用正则表达式来解析 XML 的下游应用程序”这样的可怕事情。嗯……这就是为什么唯一应该与 XML 交互的是 XML 解析器的原因。我不确定是否有任何常规方法可以解决此问题,但作为不得已的方法,您可以做同样可怕的事情,例如 "string-replace 所有出现的 &amp;ouml;ö 在最终 XML字符串".

标签: c# xml dtd xmldocument xmltextreader


【解决方案1】:

代码看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication31
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlDocument xmlDocument = new XmlDocument();
            try
            {
                string contents = @"<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>
                <!DOCTYPE content [<!ENTITY ouml '&#246;'>]>
                <content>Test &ouml; Test
                Test</content>";

                MemoryStream stream = new MemoryStream();
                XmlTextWriter writer = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1"));
                writer.WriteString(contents);
                writer.Flush();

                byte[] bytes = new byte[stream.Length];
                stream.Position = 0;
                stream.Read(bytes, 0, (int)stream.Length);
                Console.WriteLine(Encoding.GetEncoding("ISO-8859-1").GetString(bytes));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }



        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2018-08-19
    相关资源
    最近更新 更多