2009-02-21 32 views
11

次のコードは、XSDスキーマを使用したXMLファイルの検証に役立ちます。XSDスキーマを使用したXml検証

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, xsdFilePath); 
settings.ValidationType = ValidationType.Schema; 
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); 
XmlDocument document = new XmlDocument(); 
document.Load(xmlFilePath); 
XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); 

while (rdr.Read()) 
{ 

} 
isValid = true; 

のValidationEventHandlerもエラーが何であるかを私に語ったが、「どこ」や、それらが配置されている「はライン上で」上を私に教えてくれありません。 XMLの検証に失敗した行番号を取得する方法はありますか?

答えて

28

これはあなたの後のことではありませんか?

​​オブジェクトを作成し、そのオブジェクトを通じて警告を有効にします。

残念ながら、​​オブジェクトをXmlDocument.Validate()に渡す方法はありません。
代わりに、あなたが検証しXmlReaderと(StringReaderではなくXmlDocumentXmlNodeReaderを使用して)既存のXmlDocumentを検証するXmlNodeReader

XmlDocument x = new XmlDocument(); 
x.LoadXml(XmlSource); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.CloseInput = true;  
settings.ValidationEventHandler += Handler; 

settings.ValidationType = ValidationType.Schema; 
settings.Schemas.Add(null, ExtendedTreeViewSchema); 
settings.ValidationFlags = 
    XmlSchemaValidationFlags.ReportValidationWarnings | 
XmlSchemaValidationFlags.ProcessIdentityConstraints | 
XmlSchemaValidationFlags.ProcessInlineSchema | 
XmlSchemaValidationFlags.ProcessSchemaLocation ; 

StringReader r = new StringReader(XmlSource); 

using (XmlReader validatingReader = XmlReader.Create(r, settings)) { 
     while (validatingReader.Read()) { /* just loop through document */ } 
} 

ハンドラを使用することができます

private static void Handler(object sender, ValidationEventArgs e) 
{ 
     if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) 
      System.Diagnostics.Trace.WriteLine(
      String.Format("Line: {0}, Position: {1} \"{2}\"", 
       e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); 
} 
+2

+1完全に逃したe.Exception.LineNumberとe.Exception.LinePosition。 – Elroy

+0

なぜこれを最初にXmlDocumentに入れていますか?それは何もしていないようです。 –

+0

@JeremyHolovacs真実、それは2007年のフォーラム(http://www.devnewsgroups.net/dotnetframework/t43762-catching-line-numbers-with-xmldocument-validate.aspx)の回答の一つに過ぎません。次のようなコメントがありました。「XmlDocumentを削除し、XmlNodeReaderを の 'StringReader'に置き換えると動作します。 – VonC

3

ValidationEventArgsを.Messageにはテキスト内の行/列が含まれます。

ValidationEventArgs.Exceptionには、行と列のフィールドがあります。

関連する問題