将格式不正确的XML加载到XDocument(多个DTD)

时间:2010-04-21 16:07:17

标签: .net dtd doctype linq-to-xml xml-parsing

我在处理数据方面遇到了问题,这些数据几乎是格式正确的XHTML文档,除非它在开头有多个DTD声明:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    ...
  </head>
  <body>
    ...
  </body>
</html>

我只需要使用第一个 DTD和忽略其余声明,将此数据加载到XDocument对象中。无法完全忽略DTD处理,因为文档可能包含&acirc;&euro;等异常字符。

从外部源检索文本,我不知道为什么会这样。

显然,我加载此文档的天真尝试失败了System.Xml.XmlException : Cannot have multiple DTDs

        var xmlReaderSettings = new XmlReaderSettings
                                    {
                                        DtdProcessing = DtdProcessing.Parse,
                                        XmlResolver = new XmlPreloadedResolver(),
                                        ConformanceLevel = ConformanceLevel.Document,
                                    };
        using (var xmlReader = XmlReader.Create(stream, xmlReaderSettings))
        {
            return XDocument.Load(xmlReader);
        }

处理此类数据的最佳方法是什么?

P.S:我忘了提到,数据来自Stream,这可能会也可能不会使字符串操作更复杂

1 个答案:

答案 0 :(得分:1)

我不确定是否存在忽略此问题的XmlReader设置,但您可以始终使用标准字符串操作来删除额外的文档类型。