如何使用<! - ENTITY - >和<! - NOTATION - >创建XML文档,XmlDocument.Load()可以解析

时间:2011-08-29 19:14:52

标签: .net xml

我正在尝试serialize Xml to Bson。这意味着支持System.Xml.XmlNode的所有子类。但是,我现在无法理解如何实现其中包含XmlEntityXmlNotation的xml文档。

我尝试使用XmlDocument.Load解析html 4.0.1 strict dtd,但是我收到以下错误:

System.Xml.XmlException : 'ENTITY' is an unexpected token. The expected token is 'DOCTYPE'. Line 78, position 3.

是否有另一种方法可以获得具有XmlEntity和XmlNotation子节点的XmlDocument?

2 个答案:

答案 0 :(得分:1)

作为一个建议,如果你找不到你想要的东西:我一直在玩SgmlReader,它具有SgmlDtd的内置功能,可以在SGML DTD中读取,这不是与XML DTD相同。

它包含一个在4.01过渡后建模的HTML .dtd,但是考虑到了更多的错误,这些错误甚至可以解析非常糟糕的HTML。 (“更糟糕”而不是4.01过渡期,我相信他们提供的示例是元素中的标记。)

我离题了;我的实际观点是,HTML DTD是一个SGML DTD,它与XML dtd有很大的不同,所以也许这就是问题所在?如果是这样,我相信您应该能够将XML DTD的.dtd加载到SgmlReader中,然后它应该允许您将任何Xml .dtd读入SgmlReader使用的后备存储中:XmlDocument。 [编辑:我发现了这个XmlSpec document from Oct 1, 2005 from www.w3.org;这是XML DTD;想看看我是否可以找出DTD .dtd的位置,或者它是否与某种程度相关......]

它的主要用途似乎是用于修复格式错误的Html进入Xml,但我没有看到任何理由为什么它不能正常工作。让我知道如果你有问题,代码有点密集,但一旦我更好地了解它就相当简单。 [喝了点咖啡,小酒,你知道......]:P

祝你好运!

答案 1 :(得分:0)

Shellybutterfly在她建议使用SgmlReader时开始指出的问题是,我使用的是SGML dtd,而不是xml dtd。我从w3schools中找出了xml dtd的格式。

我发现您需要创建一个xml文档,带有根元素,并在DOCTYPE中声明dtd。能够使用XmlDocument.Load()加载它。对于我使用的test case

<!DOCTYPE contact
[
    <!NOTATION PublicNotation PUBLIC 'PublicId' >
    <!NOTATION SystemNotation SYSTEM 'SystemId' >
]>
<contact>
</contact>

我能够在tests project中使用它。