c# - 使用 Schematron 验证 XML

标签 c# xml xsd schematron

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

最佳答案

最好用Saxon-HE from Nuget因为它比现在在 .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 混合使用以获得额外的控制和决策。

关于c# - 使用 Schematron 验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759417/

相关文章:

Java XML 验证 : Unable to resolve definitions from local XSD files

xml - 动态生成 XSD 时 XML 架构中根元素的定义不正确

xml - 在哪里可以找到 Amazon 发布的 S3 XSD(XML 架构定义)?

c# - 异步方法可以阻塞变量而不是调用方法吗?

C# asp.net- 如何从母版页访问内容页的方法?

c# - Double 值的相加不会在整数的小数点分隔符后输出任何内容(如 4 +4)

用于大文件的 Java XML 解析器

java - 如何设置弹窗的画面自动适应横屏的长度

xml - 使用 XSD 一个元素对另一个元素的依赖性

c# - 使用没有 id 的列表 <strings> 加入 Linq 以从中索引