使用dotNet对Onix 2.1 dtd验证xml

时间:2015-01-06 23:28:21

标签: c# dtd xmlreader xml-validation onix

我正在尝试针对ONIX 2.1 dtd验证XML Feed。当我将生成的XML文件加载到XMLSpy并验证DTD时,它会告诉我该feed是有效的。

当我尝试使用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);
        });

1 个答案:

答案 0 :(得分:2)

问题可能在于DTD。您可以尝试使用在线DTD和Schema验证器...

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)) { ... }