c # XDocument Проверка шаблона XSD с символом $ - PullRequest
5 голосов
/ 14 февраля 2012

У меня проблема с проверкой c # XDocument XSD.

Следующий файл хорошо проверен Xml Spy, но не .Net (c #)

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Simple.xsd">
    <Var Name="$Toto"/>
</Root>

Схема

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Var">
                    <xs:complexType>
                        <xs:attribute name="Name" type="ST_VariableIdentifier" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
        <xs:simpleType name="ST_VariableIdentifier">
        <xs:restriction base="xs:string">
            <xs:pattern value="$[a-z,A-Z]*"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Идея?

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Это должно работать!

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Var">
          <xs:complexType>
            <xs:attribute name="Name" type="ST_VariableIdentifier" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="ST_VariableIdentifier">
    <xs:restriction base="xs:string">
      <xs:pattern value="[$][a-z,A-Z]*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
0 голосов
/ 15 февраля 2012

Просто чтобы добавить к существующему ответу.На самом деле это известная «ошибка» в реализации .Net спецификаций W3C (подтверждено здесь при подключении, но не исправит ).

MSDN обеспечиваетдополнительная информация ( здесь ) вместе с упомянутым выше обходным путем.

Реализация System.Xml Рекомендаций Консорциума World Wide Web (W3C) для XML-схем использует класс RegExвыполнить сопоставление с образцом регулярных выражений.В некоторых случаях поведение, рекомендуемое W3C, отличается от поведения класса RegEx.Ниже приведены известные случаи, когда реализация сопоставления с образцом в System.Xml отличается от спецификации W3C:

В соответствии со спецификацией W3C для схемы XML знак доллара ($) следует рассматривать как обычный символ.Однако проверка System.Xml интерпретирует знак доллара в шаблоне xs: как привязку конца строки.Возможный обходной путь - заменить $ на [$].Если ваш шаблон уже в квадратных скобках, например [abc $], нет необходимости вносить какие-либо изменения.

...