将格式不太好的 XML 加载到 XDocument(多个 DTD)中

Loading not-so-well-formed XML into XDocument (multiple DTD)

提问人:Gart 提问时间:4/22/2010 最后编辑:Gart 更新时间:5/5/2010 访问量:1178

问:

我在处理数据时遇到了一个问题,它几乎是格式正确的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 处理,因为文档可能具有异常字符,如 or 等。&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);
        }

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

PS:我忘了说,数据来自一个 它可能会也可能不会使字符串操作更复杂一些Stream

. DTD doctype linq-to-xml xml-parsing

评论


答:

1赞 David 4/22/2010 #1

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