我正在评估SAXON EE版本以根据xsd和schematron验证XML。
有人可以帮我解决以下问题:
在针对xsd验证xml文档时,我们是否还可以获得该错误节点的xpath以及纯文本中的错误。目前我只收到错误。
我们可以使用Saxon EE版本对schematron验证xml吗?任何代码示例都会有很大的帮助。
感谢。
答案 0 :(得分:1)
<强> 1。在针对xsd验证xml文档时,我们是否也可以获得该错误节点的xpath。
是的,错误信息包括对无效节点的XPath引用(在大多数情况下:在某些情况下,例如重复ID,其中一个特定节点没有错误)。
如果使用SchemaValidator.SetValidityReporting()
生成XML有效性报告,则生成的报告将包含路径信息。这是一个例子:
<?xml version="1.0" encoding="UTF-8"?>
<validation-report xmlns="http://saxon.sf.net/ns/validation"
system-id="file:/Users/mike/repo2/samples/data/books-invalid.xml">
<error line="3"
column="17"
path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/@x"
xsd-part="1"
constraint="cvc-complex-type.3">Attribute @x is not allowed on element <BOOKS></error>
<error line="10"
column="17"
path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[1]/Q{}PRICE[1]"
xsd-part="2"
constraint="cvc-datatype-valid.1">The content "$0.2" of element <PRICE> does not match the required simple type. Cannot convert string to decimal: $0.2</error>
<error line="21"
column="20"
path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[2]/Q{}PUB-DATE[1]"
xsd-part="2"
constraint="cvc-datatype-valid.1">The content "2002-02-31" of element <PUB-DATE> does not match the required simple type. Invalid date "2002-02-31" (Non-existent date)</error>
<error line="42"
column="22"
path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[3]/Q{}REPUTATION[1]"
xsd-part="1"
constraint="cvc-complex-type.2.4">In content of element <ITEM>: The content model does not allow element <REPUTATION> to appear immediately after element <WEIGHT>. No further elements are allowed at this point. </error>
<meta-data>
<validator name="SAXON-EE" version="9.8.0.9"/>
<results errors="4" warnings="0"/>
<schema file="books.xsd" xsd-version="1.1"/>
<run at="2018-03-07T15:22:04.847Z"/>
</meta-data>
</validation-report>
如果您提供IInvalidityHandler
作为SchemaValidator
的回调,您也可以获取相关信息,但这需要更多挖掘。 Saxon称你的IInvalidityHandler
提供StaticError
对象(这有点用词不当)。 StaticError
对象没有直接提供路径信息,但它包含对XPathException
对象的引用,该对象可以转换为ValidationException
,ValidationException
有一个方法getPath()
,如果可用,它会返回此信息。
<强> 2。我们可以针对schematron验证xml吗?
Saxon本身并没有包含一个schematron验证器,尽管许多执行schematron验证的第三方工具都使用了Saxon&#34;#34;。我不了解.NET的情况 - 但基本上有两种Schematron处理器:从schematron架构生成XSLT代码的处理器(通常使用Saxon来生成XSLT并执行它),&#34;本地&#34;处理器。在.NET&#34;上搜索&#34; schematron;给你很多项目,但我不知道他们目前的状态或质量。