2015-01-06 7 views
1

ONIX 2.1 dtd에 대한 XML 피드의 유효성을 검사하려고합니다. 생성 된 XML 파일을 XMLSpy에로드하고 DTD에 대해 유효성을 검사하면 피드가 유효 함을 알립니다.dotnet을 사용하여 Onix 2.1 dtd에 대해 XML 유효성 검사

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 및 스키마 검증 ... 당신은 대신 XSD에 대해 유효성을 검사 할 수

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

이있다. Onix 2.1 xsd는 http://www.editeur.org/15/Previous-Releases/#R%202.1%20Downloads에 있습니다. 당신은 기본 네임 스페이스를 설정해야합니다 :

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

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); 

, DTD 구문 분석을 해제