使用Schematron验证XML

时间:2014-07-15 13:23:35

标签: c# xml xsd schematron

我正在尝试使用Schematron验证XML文件,这比XSD更复杂。我google了很多,最好的事情就是这个Microsoft website。但这只展示了如何使用NMatrix.Schematron验证XSD,这不是我需要的。我有NMatrix.Schematron DLL但我不知道如何使用它们。有谁知道如何使用它?

3 个答案:

答案 0 :(得分:3)

我建议您使用Rick Jelliffe的reference implementation of ISO Schematron使用纯XSLT,最好是XSLT 2.0,使用已建立的XSLT处理器,例如Michael Kay的Saxon

答案 1 :(得分:3)

最好使用Saxon-HE from Nuget,因为它支持的程度远远超过Schematron现在.NET上的日子>

我正在使用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混合以进行额外的控制和决策。

答案 2 :(得分:1)

某些程序,如oXygen,支持schematron验证,但它们可能会使用类似RI的东西。