我使用Saxon-EE 9.7.0.7的.NET“端口”来验证C#Windows服务中的XML文档。当元素的内容与为模式中的元素定义的类型不匹配时,可以截断元素的实际内容。例如,使用此代码时:
XDocument doc = XDocument.Load(@"C:\Test.xml");
Processor proc = new Processor(true);
SchemaValidator validator;
StringBuilder validationErrors;
string result;
proc.SetProperty("http://saxon.sf.net/feature/validation-warnings", "true");
proc.SchemaManager.XsdVersion = "1.0";
proc.SchemaManager.Compile(new Uri(@"C:\Test.xsd"));
validator = proc.SchemaManager.NewSchemaValidator();
validator.SetSource(doc.CreateReader());
validator.ErrorList = new ArrayList();
validator.Run();
validationErrors = new StringBuilder();
foreach (StaticError e in validator.ErrorList)
validationErrors.AppendLine(e.ToString());
result = validationErrors.ToString();
验证此文档:
<root>
<child>The content of this element is not valid.</child>
</root>
针对此架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="child">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{0,3}" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Saxon-EE返回此错误消息:
元素的内容“此元素的内容是......”与所需的简单类型不匹配。值“此元素的内容为......”违反元素子类型的模式方面“[0-9] {0,3}”
另一方面,Xerces 2.11针对同一模式验证同一文档,返回:
cvc-pattern-valid:值'此元素的内容无效。'对于'#AnonType_childroot'类型的模式'[0-9] {0,3}',它不是facet-valid。
和.NET的内置模式验证返回:
'child'元素无效 - 值'此元素的内容无效。'根据其数据类型'String'无效 - 模式约束失败。
有没有办法在报告错误时配置Saxon-EE不截断无效内容?自从我们获得许可以来,Saxon在验证(XSD 1.0和1.1)和转换(XSLT 1.0,2.0和3.0)XML方面对我们非常有效,但这已成为一个重要问题。欢迎任何建议。
知道为什么你认为截断是一个“重大问题”会很有趣:你是如何使用错误信息的?
错误消息主要用于人类消费,并且包括源文档内容的片段的主要目的是使得能够容易地识别错误发生的位置。如果我们输出一个10Kb文本节点的整个内容,我认为很多用户都不会感到高兴,这显然是判断在哪里划线的问题。
如果您想自定义报告,或者自动分析验证错误,您可以按照@kjhughes的建议编写自己的ErrorListener
,或者使信息更易于访问的InvalidityHandler
,或者您可以通过XML验证工作报告。对于此示例,验证报告为:
<?xml version="1.0" encoding="UTF-8"?>
<validation-report xmlns="http://saxon.sf.net/ns/validation"
system-id="file:/Users/mike/Desktop/temp/test.xml">
<error line="2"
column="12"
path="/Q{}root[1]/Q{}child[1]"
xsd-part="2"
constraint="cvc-datatype-valid.1">The content "The content of this element is..." of element <child> does not match the required simple type. Value "The content of this element is..." contravenes the pattern facet "[0-9]{0,3}" of the type of element child</error>
<meta-data>
<validator name="SAXON-EE" version="9.8.0.9"/>
<results errors="1" warnings="0"/>
<schema file="test.xsd" xsd-version="1.1"/>
<run at="2018-02-28T12:47:28.527Z"/>
</meta-data>
</validation-report>
并且因为这包括无效元素的完整路径,您可以轻松地扩展它(使用XSLT 3.0和xsl:evaluate)以包含节点的完整内容(如果这是您想要的)。
如果从命令行运行验证,则可以使用-report:report.xml选项获取此报告。从s9api SchemaValidator
你可以使用validator.setValidityReporting()
得到它。