XDocument更改架构

时间:2017-06-23 10:22:39

标签: c# xml validation xsd linq-to-xml

我正在使用带有XSD文件的XML验证器。 XML必须使用任何XSD文件进行验证,这意味着必须将XSD架构添加到XML文件中,但当然必须首先从XML中删除架构(如果存在)。 我的解决方法:

- 我正在使用递归从XML文件中成功删除模式。

- 我已成功将XSD架构添加到XML中。

我遇到的问题是验证:

XDocument doc = XDocument.Load(filename);

/ *递归地添加/删除模式* /

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保存到临时文件中?

1 个答案:

答案 0 :(得分:1)

我不明白...... ValidationEventHandler ValidationEventArgs Exception LineNumber属性为LinePositionXDocument.Load()。当然,如果您对模式验证,则不检查它是否格式正确(这是Validate()应该做的唯一事情,AFAIK)。

关于针对任意架构的验证:有extension method 添加重载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);
|

然后加载文档,它将具有所需的信息:

var zip = new JSZip(content);
var doc=new Docxtemplater().loadZip(zip)
var text= doc.getFullText();
console.log(text);