使用 dotNet 针对 Onix 2.1 dtd 验证 xml

本文关键字:dtd 验证 xml dotNet 针对 Onix 使用 | 更新日期: 2023-09-27 18:36:42

我正在尝试针对ONIX 2.1 dtd验证XML提要。当我将生成的 XML 文件加载到 XMLSpy 中并根据 DTD 进行验证时,它告诉我源是有效的。

当我尝试使用 C# 和 XmlReader 验证同一文件时,我收到错误,指出子节点无效,尽管第三方工具之前已进行验证。 我需要做什么才能确保使用 XmlReader 的代码正确读取 dtd 并进行适当的验证?

这是我的代码...

XmlReaderSettings settings = new XmlReaderSettings();
        settings.ProhibitDtd = false;
        settings.ValidationType = ValidationType.DTD;
        settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(delegate(object sender, ValidationEventArgs args)
        {
            isXmlValid = false;
            xmlValMsg.AppendLine(args.Message);
        });

使用 dotNet 针对 Onix 2.1 dtd 验证 xml

问题可能出在 DTD 上。有一个在线 DTD 和模式验证器,您可以尝试...

http://www.validome.org/grammar/

您可以尝试改为针对 XSD 进行验证。Onix 2.1 xsd 可在 http://www.editeur.org/15/Previous-Releases/#R%202.1%20Downloads 购买。 您必须设置默认命名空间:

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 解析:

var settings = new XmlReaderSettings
    {
        ValidationType = System.Xml.ValidationType.Schema,
        DtdProcessing = DtdProcessing.Ignore
    };
using(var reader = XmlReader.Create("path to xml file", settings, context)) { ... }