2013-03-15 29 views
5

私がしようとしているのは、XSDに対してXMLを検証することです。これはすべて簡単ですが、名前空間のないXMLに問題があります。 C#は、ネームスペースがXSDのターゲットネームスペースと一致する場合にのみxmlを検証します。これは正しく見えますが、名前空間やSchemaSetのないXMLでは例外が発生します。これを達成するためのプロパティーや設定がありますか?または、xmlのxmlns属性を読み取って手動で名前空間を取得する必要がありますか?.NETのXML検証と名前空間

clearifyする例:

コード:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add("http://example.com", @"test.xsd"); 
settings.Schemas.Add("http://example.com/v2", @"test2.xsd"); 
settings.ValidationType = ValidationType.Schema; 

XmlReader r = XmlReader.Create(@"test.xml", settings); 

XmlReader r = XmlReader.Create(new StringReader(xml), settings); 
XmlDocument doc = new XmlDocument(); 
try 
{ 
    doc.Load(r); 
} 
catch (XmlSchemaValidationException ex) 
{ 

    Console.WriteLine(ex.Message); 
} 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="test"> 
     <xs:annotation> 
      <xs:documentation>Comment describing your root element</xs:documentation> 
     </xs:annotation> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:pattern value="[0-9]+\.+[0-9]+" /> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
</xs:schema> 

有効なXML:

<test xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</test> 

無効なXMLを、これは検証しません。

<hello xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello> 

エラー:。

無効なXMLが、名前空間が存在しないため、検証します:

<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello> 

私はこれをどのように修正することができますか?

ご迷惑をおかけして申し訳ございません。私は見つけることができます

答えて

3

XMLで無効な名前空間はXmlSchemaValidationExceptionをトリガしていない理由、それは単なる警告であるため、あるのに役立ちます。

したがって、警告が報告されるようにコードを変更する必要があります。まず

:​​

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings; 

PSでValidationflagsプロパティを設定します。検証フラグを設定することで、あなたが必要なすべてのフラグを設定することを確認しますが、そうでない場合は、いくつかのvalidationchecksはスキップされます。 私はProcessIdentityConstraintsを使用していますので、私のidentity-constraints(xs:key、xs:keyref、...)も検証されます。詳細はhttp://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspxです。

次へ:警告が報告されたときの対処方法をバリデーターに伝えます。警告またはエラーが

private static void SchemaValidatorHandler(object sender, ValidationEventArgs e) 
    { 
     if (e.Severity == XmlSeverityType.Warning || e.Severity == XmlSeverityType.Error) 
     { 
      //Handle your exception 
     } 



    } 

最終を発生したときにそれがトリガされ、検証イベントを作成します:あなたはそれを

+0

いいえ - 私はこれを試しましたが、バリデーターはハンドラをまったく起動していません。 .Netはこれを警告とはみなしていないようです。 –

1

は、私は常にXmlDocumentで、それは警告をスローします一致しない名前空間のためにエラーが発生した場合、それは例外をスローと考えているXmlDocument.Validate()
http://msdn.microsoft.com/en-us/library/ms162371.aspx

する方法があります。 XmlValidationとエラーの種類について詳しく読むことができます。 ValidationEventHandlerが呼び出されるとXmlSeverityType.Warningに等しいValidationEventArgs.Severityが渡された場合、警告MSDN
から一部抜粋下に貼り付け http://msdn.microsoft.com/en-us/library/aa310912%28v=vs.71%29.aspx

、文書の処理が継続されます。例外はスローされず、スキーマ文書の処理は続行されます。 Error ValidationEventHandlerが呼び出され、XmlSeverityType.Errorに等しいValidationEventArgs.Severityが渡された場合、ドキュメントの処理は続行され、無効なデータは破棄されます。例外がスローされ、スキーマ文書の処理が停止します。
ホープこれは

+0

をだご確認

settings.ValidationEventHandler += new ValidationEventHandler(SchemaValidatorHandler); 

に使用するバリデータのイベントハンドラを設定します。お返事をありがとうございます。それは私の問題を解決するのに役立った – JeanD

+0

あなたの歓迎!!! –