0

我试图使用 .DTD 验证 XML 文件,但它给了我以下错误。

'ENTITY' 是一个意外的标记。预期的令牌是“DOCTYPE”。第 538 行,位置 3。

        public static void Validate(string xmlFilename, string schemaFilename)
    {
        XmlTextReader r = new XmlTextReader(xmlFilename);
        XmlValidatingReader validator = new XmlValidatingReader(r);
        validator.ValidationType = ValidationType.Schema;

        XmlSchemaCollection schemas = new XmlSchemaCollection();
        schemas.Add(null, schemaFilename);


        validator.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);

        try
        {
            while (validator.Read())
            { }
        }
        catch (XmlException err)
        {
            Console.WriteLine(err.Message);
        }
        finally
        {
            validator.Close();
        }
    }

我用来验证的 DTD = http://www.editeur.org/onix/2.1/reference/onix-international.dtd

我希望有人可以帮助我谢谢!

4

2 回答 2

0

编辑:

刚刚注意到:您的验证类型也设置错误。尝试将其设置为 ValidationType.DTD 而不是 Schema。

MSDN 上的 ValidationType

--

该错误的含义与它所说的完全一样——引用的 DTD 格式不正确,因为 DOCTYPE 应该出现在 DTD 中的任何其他声明之前。

文档类型定义(维基百科)

DTD 简介(w3schools)

您可以通过下载本地副本、修改它以自己添加预期的根元素,然后在源代码中引用您编辑的版本来解决此问题。

于 2009-10-08T15:17:16.970 回答
0

我意识到这是一个非常古老的问题,但对于其他任何在这个问题上苦苦挣扎的人,这就是我所做的。

我放弃了尝试使用 DTD 进行验证。

相反,我最终使用了http://www.editeur.org/15/Previous-Releases/#R%202.1%20Downloads上提供的 onix 2.1 xsd 。我必须设置默认命名空间:

var nt = new NameTable();
var ns = new XmlNamespaceManager(nt);
ns.AddNamespace(string.Empty, "http://www.editeur.org/onix/2.1/reference");
var context = new XmlParserContext(null, ns, null, XmlSpace.None);

然后在加载 xml 时,关闭 DTD 解析(这是使用 .NET4)

var settings = XmlReaderSettings
                {
                    ValidationType = System.Xml.ValidationType.Schema,
                    DtdProcessing = DtdProcessing.Ignore
                }
using(var reader = XmlReader.Create("path to xml file", settings)) { ... }
于 2013-10-01T14:20:08.470 回答