#javascript #xml #xsd #msxml
#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>
Я хотел бы проверить идентификатор узла разумным способом: первые 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);
var b2= parseInt(b/10000);
var b3= parseInt(b/1000);
var b4= parseInt(b/100);
var b5= parseInt(b/10);
var b6= b;
if (b6 == (b1 b2 b3 b4 b5) )
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)?
Спасибо
Ответ №1:
В стандартном XSD самое близкое, что вы можете получить, — это использовать pattern
элемент. Это указывает регулярное выражение, которому должно соответствовать содержимое.
Однако регулярные выражения хороши только для довольно простой проверки и не смогут выполнять то, что вы хотите.
Одним из вариантов является добавление скрипта в элемент аннотации типа. Это предназначено для «аннотаций компонентов схемы, ориентированных на человека и машину». Затем вы могли бы выполнить этот скрипт в качестве второго этапа, тем самым создав более общее решение, которое вы желаете.
Поскольку вы используете MSXML, вы можете извлекать типы данных XSD с помощью SOM.