Я хочу проверить свой xml по схеме, однако для некоторых узлов мне нужна более умная проверка, чем то, что могут предложить схемы xsd.
Например, у меня есть файл Person.xml:
<?xml version="1.0" encoding="utf-8"?>
<person xmlns="urn:person.xsd">
<name>John Smith</name>
<id>123455</id>
</person>
Я хотел бы проверить правильность идентификатора узла: первые 5 цифр (12345) - это идентификатор человека, а шестая цифра (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, и я не хочу жестко закодированное решение.
Вероятно, это общая проблема, но я не смог найти решение.
Так, где лучше всего разместить дополнительную информацию для проверки?
В качестве альтернативы есть ли способ расширить валидатор XML MSXML или .Net для поддержки пользовательской валидации (моя программа написана в основном на .Net)?
Спасибо