XSD ограничение типа Javascript - PullRequest
1 голос
/ 08 июня 2011

Я хочу проверить свой 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)?

Спасибо

1 Ответ

0 голосов
/ 08 июня 2011

В стандартном XSD ближе всего можно использовать элемент pattern .Здесь указывается регулярное выражение, которому должен соответствовать контент.

Однако регулярные выражения хороши только для довольно простой проверки и не смогут выполнять то, что вы хотите.

Один вариантэто добавить скрипт к элементу аннотации типа .Он предназначен для «аннотаций компонентов схемы, ориентированных на человека и машину».Затем вы можете выполнить этот сценарий в качестве второго этапа, создав тем самым более общее решение, которое вам нужно.

Поскольку вы используете MSXML, вы можете извлекать типы данных XSD, используя SOM .

...