私自身の質問に対する私の答えをチェックしてください。
コード ブロックの後の最初の段落は重要ですが、基本的にSchemaInfo
そこにはありますが、検証コールバックの後まで追加されません。
私が使用した回避策は基本的に次のとおりです (注: このコードは、XML を直接ロードして を呼び出すときにテストされ、機能しますXDocument.Validate
がXmlSchemaSet
、前提はXmlReader
およびインライン スキーマと同じまたは類似している必要があります):
List<XElement> errorElements = new List<XElement>();
serializedObject.Validate((sender, args) =>
{
var exception = (args.Exception as XmlSchemaValidationException);
if (exception != null)
{
var element = (exception.SourceObject as XElement);
if (element != null)
errorElements.Add(element);
}
});
foreach element in errorElements
{
var si = element.GetSchemaInfo;
// do something with SchemaInfo
}
SchemaInfo
私は要素のキャプチャのみを試みていたため、as
キャストとnullチェックが行われましたが、これは他のノードタイプでも機能するはずですAttributes
(ただし、テストされていないため、間違っている可能性があります)。
匿名のデリゲートの代わりに特定のコールバック メソッドを使用する場合はerrorElements
、クラス レベルのフィールドである必要があり、検証が完了した後に必要なことを行うことができます (ここでも、テストされていないメソッドを追加します) 。鬼ごっこ)。
public class SomeClass
{
List<XElement> errorElements = new List<XElement>();
public void Load()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("xml/note.xml", settings);
// Load the XDocument from the reader
XDocument loadedDoc = XDocument.Load(reader);
// do something with errorElements
}
public void ValidationCallBack(object sender, ValidationEventArgs e)
{
var exception = (args.Exception as XmlSchemaValidationException);
if (exception != null)
{
var element = (exception.SourceObject as XElement);
if (element != null)
errorElements.Add(element);
}
}
}
すべてのIXSchemaInfo
ノードを必要とするというコメントに応えて、ノードが失敗したか合格したかに関係なく、検証後にスキーマ情報が XElement に追加されるため、失敗したノードのリストを保持する必要がないため、要件は実際には簡単になります。ノード。これを行うことができるはずです:
public void Load()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("xml/note.xml", settings);
// Load the XDocument from the reader
XDocument loadedDoc = XDocument.Load(reader);
foreach (var node in loadedDoc.Descendants())
{
var si = node.GetSchemaInfo();
}
}
上記の例はあなたのXElement
s にのみアクセスしますXDocument
が、それは私の要点を説明するためのものです。読み込みが完了し、xml が検証されると、スキーマ情報がそこにあるはずです。