2015-01-06 64 views
1

我試圖驗證針對ONIX 2.1 dtd的XML提要。當我將生成的XML文件加載到XMLSpy中並根據DTD進行驗證時,它告訴我該提要是有效的。使用dotNet驗證xml針對Onix 2.1 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); 
     }); 

回答

2

的問題可能是與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)) { ... }