xsd-ограничение типа javascript

#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.