2010-12-03 5 views
1

XPathNavigator.CheckValidityを使用してXML文書を検証しようとしています。どういうわけか、私はこのメソッドを使って渡されたテストを書くことができましたが、今は(不思議なことに)もう通過していません。私が変わったと思う唯一の事は、.NET 2から.NET 3.5への移行でしたが、その移行中にここで何か変わったことについてのドキュメントは見つかりません。ここでXPathNavigator.CheckValidityは無効なXML文書を検証します

はプログラム例です:

void Main() 
{ 
    try 
    { 
     GetManifest().CreateNavigator().CheckValidity(GetSchemaSet(), (sender, args) => { 
      // never get in here when debugging 
      if (args.Severity == XmlSeverityType.Error) { 
       throw new XmlSchemaValidationException("Manifest failed validation", args.Exception); 
      } 
     }); // returns true when debugging 
    } 
    catch (XmlSchemaValidationException) 
    { 
     // never get here 
     throw; 
    } 

    // code here runs 
} 

IXPathNavigable GetManifest() 
{ 
    using (TextReader manifestReader = new StringReader("<?xml version='1.0' encoding='utf-8' ?><BadManifest><bad>b</bad></BadManifest>")) 
    { 
     return new XPathDocument(manifestReader); 
    } 
} 

XmlSchemaSet GetSchemaSet() 
{ 
    var schemaSet = new XmlSchemaSet(); 
    using (var schemaReader = new StringReader(Schema)){ 
     schemaSet.Add(XmlSchema.Read(schemaReader, null)); 
    } 

    return schemaSet; 
} 

const string Schema = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://www.engagesoftware.com/Schemas/EngageManifest""> 
    <xs:element name=""EngageManifest""> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name=""Title"" type=""xs:string"" /> 
     <xs:element name=""Description"" type=""xs:string"" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>"; 

私はValidate XML with a XSD Schema without changing the XML using C#で解決策を試してみたが、私は同じ結果を取得しています...私は、この検証の事がどのように機能するかにいくつかの大きな配慮が欠落しなければなりませんしかし、私はそれを見ることができません...

答えて

3

問題は、あなたのXMLがデフォルト名前空間を使用していますが、XSDがターゲット名前空間を指定しているということです。 XMLに<BadManifest xmlns="http://www.engagesoftware.com/Schemas/EngageManifest">を指定した場合、バリデータはエラーを予期した通りに報告するはずです。さもなければ、それはXMLの名前空間を認識しないので、それを単に無視します。

+0

したがって、ドキュメントにxmlnsを必要とせずにスキーマに対して検証する方法はありますか? targetNamespaceを指定するXSDを持つxmlnsがないドキュメントを検証することは不可能ですか? – bdukes

+0

基本的には一致させる必要があります.XMLに関する限り、同じ名前で異なる名前空間の要素は決して関連しません。選択肢は、XSD内のtargetNamespaceを省略するか、XML内の名前空間を設定することです。あなたはそれを解析した後にプログラムでXMLの名前空間を設定できますが、それを行う必要がある場合は、あなたの名前空間がどのような目的を果たしているのか、入力XMLが最初の名前空間にない理由場所。 – MarkXA

+0

これはユーザー提供のテンプレート文書用ですので、名前空間を含める必要がありすぎて負担になります。インテリセンスがより自動になるようにネームスペースを使いたいと思っていましたが、名前空間を削除するのが最も簡単なようで、インテリセンスが必要な場合は手動でXSDに関連付けることができます。 – bdukes

関連する問題