我想针对模式验证我的xml,但是对于某些节点,我想要比xsd模式提供的更智能的验证。
例如,我有一个Person.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<person xmlns="urn:person.xsd">
<name>John Smith</name>
<id>123455</id>
</person>
我想以智能方式验证ID节点:前5位(12345)是人的ID,第6位(5)是校验和数字,由总和计算得出模数为10的前五位数(1 + 2 + 3 + 4 + 5模数10 = 5)。
理想情况下,我想扩展xsd架构的验证支持,以允许诸如javascript之类的代码验证节点。
例如:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:person.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="id">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:javascript>
var b= parseInt(input);
var b1= parseInt(b/100000)%10;
var b2= parseInt(b/10000)%10;
var b3= parseInt(b/1000)%10;
var b4= parseInt(b/100)%10;
var b5= parseInt(b/10)%10;
var b6= b%10;
if (b6 == (b1+b2+b3+b4+b5)%10 )
return "true";
else
return "false";
</xs:javascript>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
现在这当然不受支持。我可以将此节点验证为字符串,并在我的源代码中进行进一步验证。但我想要一个通用的解决方案,我的代码除了任何xml,我不想要一个硬编码的解决方案。
这可能是一个常见问题,但我找不到解决方案。
那么放置额外验证信息的最佳位置在哪里?
或者有一种方法可以扩展MSXML或.Net的XML验证器来支持自定义验证(我的程序主要是用.Net编写的)?
谢谢
答案 0 :(得分:0)
在标准XSD中,您可以获得的最接近的是使用pattern
element。这指定了内容必须符合的正则表达式。
但是,正则表达式仅适用于相当简单的验证,并且无法满足您的需求。
一种选择是将脚本添加到该类型的annotation element。这是为“架构组件的以人机和机器为目标的注释”而设计的。然后,您可以将此脚本作为第二阶段执行,从而创建所需的更通用的解决方案。
由于您使用的是MSXML,因此可以使用SOM检索XSD数据类型。