C# 具有内联架构的XDocument。SchemaInfo为空
好的,我们开始吧。我有一组XML文档正在加载到我的应用程序中。在我的小测试中,我创建了一个阅读器,它根据XML文档指定的模式进行验证。使用下面的代码,它工作得非常好C# 具有内联架构的XDocument。SchemaInfo为空,c#,xml,xsd,linq-to-xml,C#,Xml,Xsd,Linq To Xml,好的,我们开始吧。我有一组XML文档正在加载到我的应用程序中。在我的小测试中,我创建了一个阅读器,它根据XML文档指定的模式进行验证。使用下面的代码,它工作得非常好 // Set the validation settings. XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags |= XmlS
// 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);
现在,我的XML文档被正确加载,发生的任何验证错误都由回调处理
但是,如果我想通过对某个元素调用GetSchemaInfo()来获取该元素的模式信息,则会得到null。谈到使用重载的验证方法,但这并不适用于这种情况,除非我遗漏了什么
是否可以使用内联模式将模式信息加载到XDoc中,或者我应该以另一种方式执行此操作?查看我自己的问题
代码块后面的第一段对您来说很重要,但基本上,SchemaInfo
将在那里,但它在验证回调之后才会添加
我使用的解决方法基本上是这样的(注意:当直接加载XML并在XmlSchemaSet
上调用XDocument.Validate
时,这段代码已经过测试,可以正常工作,但前提应该与XmlReader
和内联模式相同或相似):
对于您关于希望所有节点都使用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();
}
}
上面的示例只访问XDocument
中的XElement
s,但它只是为了说明我的观点。加载完成并验证xml后,模式信息应该在那里。请查看我自己的问题
代码块后面的第一段对您来说很重要,但基本上,SchemaInfo
将在那里,但它在验证回调之后才会添加
我使用的解决方法基本上是这样的(注意:当直接加载XML并在XmlSchemaSet
上调用XDocument.Validate
时,这段代码已经过测试,可以正常工作,但前提应该与XmlReader
和内联模式相同或相似):
对于您关于希望所有节点都使用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();
}
}
上面的示例只访问
XDocument
中的XElement
s,但它只是为了说明我的观点。加载完成并验证xml后,模式信息应该在那里。感谢您的回答,我无法测试,因为我远离我的开发机器,但会尽快进行测试。然而,看看代码,这似乎只适用于有错误的节点。我的目标是加载所有模式信息,最好是通过验证的文档。稍后,我们将使用该信息进行一些动态序列化。由于您仅在验证回调中收集XElement
s,因此此确切代码仅适用于有错误的节点,但在验证完成所有内容后,SchemaInfo
仍应存在,因此,您可以尝试在这一点上找到它(我将添加另一个示例)。我能够为整个文档加载模式信息的唯一方法是使用我最初引用的问题中提到的重载验证方法。看起来好像我想要访问所有需要加载和验证文档的模式信息。不是不可能,只是不理想。谢谢你的帮助。任何其他想法都是受欢迎的!谢谢你的回答,我无法测试,因为我离开了我的开发机器,但我会尽快这样做。然而,看看代码,这似乎只适用于有错误的节点。我的目标是加载所有模式信息,最好是通过验证的文档。稍后,我们将使用该信息进行一些动态序列化。由于您仅在验证回调中收集XElement
s,因此此确切代码仅适用于有错误的节点,但在验证完成所有内容后,SchemaInfo
仍应存在,因此,您可以尝试在这一点上找到它(我将添加另一个示例)。我能够为整个文档加载模式信息的唯一方法是使用我最初引用的问题中提到的重载验证方法。看起来好像我想要访问所有需要加载和验证文档的模式信息。不是不可能,只是不理想。谢谢你的帮助。任何其他想法都是受欢迎的!
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();
}
}