xsd类型javascript的限制

时间:2011-06-08 10:03:03

标签: javascript xml xsd msxml

我想针对模式验证我的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编写的)?

谢谢

1 个答案:

答案 0 :(得分:0)

在标准XSD中,您可以获得的最接近的是使用pattern element。这指定了内容必须符合的正则表达式。

但是,正则表达式仅适用于相当简单的验证,并且无法满足您的需求。

一种选择是将脚本添加到该类型的annotation element。这是为“架构组件的以人机和机器为目标的注释”而设计的。然后,您可以将此脚本作为第二阶段执行,从而创建所需的更通用的解决方案。

由于您使用的是MSXML,因此可以使用SOM检索XSD数据类型。