XDocument 更改架构
XDocument change schema
我正在使用 XSD 个文件开发一个 XML 验证器。 XML 必须使用任何 XSD 文件进行验证,这意味着必须将 XSD 模式添加到 XML 文件中,但当然必须删除该模式首先从 XML 开始(如果存在)。
我的解决方法:
-我成功地从 XML 文件中递归删除了架构。
-我已成功将 XSD 架构添加到 XML。
我遇到的问题是验证:
XDocument doc = XDocument.Load(filename);
/* adding/deleting 递归模式 */
doc.Save("temp.xml");
using (XmlReader reader = XmlReader.Create("temp.xml", settings))
doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
我使用 XmlReader 而不是 .Validate() 方法的原因是我需要突出显示实际的错误行,而 .Validate() 方法不会从 ValidationEventHandler 异常中返回 LineNumber。
是否有另一种方法来更改 XML 的架构,并且仍然通过行验证它而不将新的 xml 保存到临时文件?
我不明白...在 ValidationEventHandler
中你得到 ValidationEventArgs
其中有 Exception
属性 和 LineNumber
和 LinePosition
.当然,如果您要针对模式 验证 ,而不是检查它是否格式正确(这是 XDocument.Load()
应该做的唯一事情,AFAIK)。
关于针对任意模式的验证:有一个 extension method,其中 添加了 Validate()
的重载,您可以在其中指定另一个模式。不幸的是,由于一些不明原因,行号信息丢失了。但是,您可以在阅读期间执行验证。首先定义您要使用的架构:
var schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xmlSchema)));
然后创建一个 XmlReaderSettings
来应用您的模式:
var settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += (sender, e) =>
Console.WriteLine($"{e.Exception.LineNumber}: {e.Message}");
然后载入文档,里面会有需要的信息:
using (var reader = XmlReader.Create(stream, settings))
{
var doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
|
我正在使用 XSD 个文件开发一个 XML 验证器。 XML 必须使用任何 XSD 文件进行验证,这意味着必须将 XSD 模式添加到 XML 文件中,但当然必须删除该模式首先从 XML 开始(如果存在)。 我的解决方法:
-我成功地从 XML 文件中递归删除了架构。
-我已成功将 XSD 架构添加到 XML。
我遇到的问题是验证:
XDocument doc = XDocument.Load(filename);
/* adding/deleting 递归模式 */
doc.Save("temp.xml");
using (XmlReader reader = XmlReader.Create("temp.xml", settings))
doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
我使用 XmlReader 而不是 .Validate() 方法的原因是我需要突出显示实际的错误行,而 .Validate() 方法不会从 ValidationEventHandler 异常中返回 LineNumber。
是否有另一种方法来更改 XML 的架构,并且仍然通过行验证它而不将新的 xml 保存到临时文件?
我不明白...在 ValidationEventHandler
中你得到 ValidationEventArgs
其中有 Exception
属性 和 LineNumber
和 LinePosition
.当然,如果您要针对模式 验证 ,而不是检查它是否格式正确(这是 XDocument.Load()
应该做的唯一事情,AFAIK)。
关于针对任意模式的验证:有一个 extension method,其中 添加了 Validate()
的重载,您可以在其中指定另一个模式。不幸的是,由于一些不明原因,行号信息丢失了。但是,您可以在阅读期间执行验证。首先定义您要使用的架构:
var schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xmlSchema)));
然后创建一个 XmlReaderSettings
来应用您的模式:
var settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += (sender, e) =>
Console.WriteLine($"{e.Exception.LineNumber}: {e.Message}");
然后载入文档,里面会有需要的信息:
using (var reader = XmlReader.Create(stream, settings))
{
var doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
|