Saxon-EE截断验证错误中的内容

时间:2018-02-27 20:52:39

标签: c# xml xsd saxon

我使用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:值'此元素的内容无效。'对于模式'[0-9] {0,3}'而言不是分面有效的输入'#AnonType_childroot'。

和.NET的内置模式验证返回:

  

'child'元素无效 - 值<此元素的内容无效。'根据其数据类型'String'无效 - 模式约束失败。

在报告错误时,有没有办法配置Saxon-EE 而不是来截断无效内容?自从我们获得许可以来,Saxon在验证(XSD 1.0和1.1)和转换(XSLT 1.0,2.0和3.0)XML方面对我们非常有效,但这已成为一个重要问题。欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

知道为什么你认为截断是一个“重大问题”会很有趣:你是如何使用错误信息的?

错误消息主要供人类使用,包含源文档内容片段的主要目的是使人们能够轻松识别错误发生的位置。如果我们输出一个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 &lt;child&gt; 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()