使用 Schematron 验证 XML

问题描述 投票:0回答:4

我正在尝试使用 Schematron 验证 XML 文件,这比 XSD 更复杂。我用谷歌搜索了很多,最好的结果是这个Microsoft 网站。但这仅展示了如何使用 NMatrix.Schematron 验证 XSD,这不是我需要的。我有 NMatrix.Schematron DLL,但我不知道如何使用它们。有谁知道怎么用吗

c# xml xsd schematron
4个回答
5
投票

最好使用 Nuget 的 Saxon-HE,因为它支持的功能比现在 .NET 上的 Schematron 多得多>

我正在使用 Schematron.NET - 下载源代码和示例,编译它或仅使用示例中的 DLL。

然后我完全剪掉了图片的 XSLT,因为我不需要它。但是缺少诸如选择之类的一些东西,但是“大多数”无论如何都可以使用 XPath 进行测试。因为它有点旧,所以没有实现所有功能:( 这是使用 Schematron 进行验证的扩展版本

using NMatrix.Schematron; ... Schema schematronSchema = new Schema(); schematronSchema.Load(new FileStream("C:/thefile.sch", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); vld.AddSchema(schematronSchema); vld.Validate(new MemoryStream(Encoding.UTF8.GetBytes(XML_String)));

我使用文件流加载,这样文件就不会被锁定,这是在 .NET 的 XSLT 引擎中构建时常见的烦恼

然后在“.sch”文件中,我认为验证模式数据的方式很简单,更简洁。

<?xml version="1.0" encoding="utf-8" ?> <schema xmlns="http://www.ascc.net/xml/schematron" title="Schema for Blah"> <pattern name="A descriptive name"> <rule context="DataNodeOrElement"> <assert test="Xpath, where Name is element and @name is attribute"> Error Message </assert> </rule> </pattern>

例如。

<root> <version>1</version> <data> <name surname="rulez">ppumkin</name> <age>na</age> <title/> </data> </root> <rule context="data"> <assert test="name != ''"> No name specified </assert> <assert test="@surname != 'rulez'"> This is not the ppumkin I know!</assert> <assert test="number(age) < 110"> Not a number or not specified</assert> <assert test="number(age) > 18"> Your under age. Get 'outa!ahere!</assert> </rule>

记住,只有当测试失败时才会出现错误。也就是说,如果你有兴趣阻止 18 岁以下的人,你需要测试他们是否超过 18 岁。习惯起来有点奇怪。

说实话,我以前从未使用过 Schematron,现在我将 XML 视为埃博拉病毒以及与之相关的任何事物 - 但有时我们别无选择。

Schematron.NET 中的示例向您展示了如何将 XSLT1/XLST2 与 Schematron 混合使用,以实现额外的控制和决策。


3
投票
ISO Schematron

参考实现,使用纯 XSLT,最好是 XSLT 2.0,以及成熟的 XSLT 处理器,例如 Michael Kay 的 Saxon


1
投票


0
投票
    OxygenXML
  • 非常适合编写和调试 Schematron,但价格昂贵。
  • schematron.com
  • 上也有一些建议。其中之一是schxslt-cli.jar。 您可以从
    schxslt GitHub 存储库
    下载。
  • 用途:

java -jar schxslt-cli.jar -v -e 1 \ -d <document_path> \ -s <schema_path>

不幸的是,没有指示检测到错误的行号。

另外,我还没有找到文档,但是你可以通过生成错误来查看可用的参数:

java -jar schxslt-cli.jar

© www.soinside.com 2019 - 2024. All rights reserved.