2013-09-26 1 views
0

나는 Mismo 2.3.1, dtd 기반 스키마로 작업 중이다. dtd를 xsd로 변환 한 다음 xml doc의 객체 표현을 serialize/deserialze하기 위해 C# 코드를 생성했습니다.xmlns = ...을 포함하지 않고 xml의 유효성을 검사하는 방법을 C# XmlSerializer로 지정 하시겠습니까?

유효한 mismo 2.3.1 xml doc가 주어지면 생성 된 C# 클래스로 deserialize 할 수 있습니다.

XmlReaderSettings 및 XmlSchmeas 컬렉션과 함께 XmlSerializer를 사용하여 변환 된 xsd를 읽는 코드가 있습니다.

루트 요소에 xmlns = "http : // mySchema ..."를 삽입하고 의도적으로 잘못된 xml을 확인하려고하면 예상 한대로 작동하고 내 유효성 검사 이벤트가 정확한 설명으로 핑 처리됩니다.

나는 XMLNS, 그때 내가 얻을 속성을 꺼낼 경우 "요소에 대한 스키마 정보 [내 루트 요소]를 찾을 수 없습니다"

의 xmlns 사양없이 오는 XML의 유효성을 확인하는 방법에 대한 어떤 생각? serializer에게 "이 요소를 발견 할 때이 스키마 사용"이라고 말하는 설정은 무엇입니까?

미리 감사드립니다.

답변

0
static void Main() { 
    var settings = new XmlReaderSettings(); 
    settings.NameTable = new NameTable(); 

    var nsMgr = new XmlNamespaceManager(settings.NameTable); 
    nsMgr.AddNamespace("", "http://example.com/2013/ns"); // <-- set default namespace 

    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas.Add(null, @"C:\XSDSchema.xsd"); // <-- set schema location for the default namespace 

    var parserCtx = new XmlParserContext(settings.NameTable, nsMgr, XmlSpace.Default); 

    using (var reader = XmlReader.Create(@"C:\file.xml", settings, parserCtx)) { 
     var serializer = new XmlSerializer(typeof(Foo)); 
     Foo f = (Foo)serializer.Deserialize(reader); 
    } 
}