Как найти значения MinOccurs / MaxOccurs, используя экземпляр XmlSchema? - PullRequest
0 голосов
/ 12 июля 2011

Я использую DataSet.ReadXmlSchema() для построения набора данных и DataSet.ReadXml() для загрузки данных.

Затем я привязываюсь к набору данных для редактирования данных. Я хочу контролировать вставку и удаление строк в таблицах в наборе данных на основе свойств minOccurs и maxOccurs, определенных в моей схеме.

Я попытался загрузить приведенную ниже схему в экземпляр XmlSchema, например, MySchema. Учитывая, что minOccurs и maxOccurs по умолчанию равны 1, если не указано иное, узлы LastName и FirstName должны встречаться ровно один раз. Contacts может встречаться 0 или 1 раз, а ContactName может встречаться 0-10 раз.

Как только экземпляр XmlSchema создан, как я могу ссылаться на свойства minOccurs и maxOccurs для узлов?

Я обнаружил, что класс XmlSchemaParticle содержит свойства MinOccurs и MaxOccurs, но я не смог выяснить, как перемещаться по экземпляру XmlSchema, чтобы найти их.

Я пытался посмотреть на MySchema.Items, но, похоже, эта информация не содержит.

Это даже "лучший" подход? Любые предложения будут с благодарностью.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Person.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Person">
    <xs:complexType>
      <xs:sequence>
        <!--Required Nodes-->
        <xs:element name="LastName" type="xs:string"/>
        <xs:element name="FirstName" type="xs:string"/>
        <!-- Optional Nodes-->
        <xs:element name="Contacts" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ContactName" minOccurs="0" maxOccurs="10">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string"/>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Кто-нибудь знает, как я могу найти значения MinOccurs / MaxOccurs из экземпляра XmlSchema? Я прочитал документацию в MSDN, а также попытался перемещаться по классу через отладчик Visual Studio, но не могу найти правильные свойства для этих значений.

1 Ответ

1 голос
/ 22 июля 2011

Я не думаю, что DataSet будет уважать minOccurs / maxOccurs.

Фактически, DataSet не отображает один-к-одному в XML-схему.Класс DataSet отображается на модель реляционной базы данных.Все, что в XML-схеме не сопоставляется с этой моделью, будет игнорироваться или преобразовываться с помощью DataSet.

. В качестве примера был случай, когда у меня были элементы одного и того же сложного типа, что и дочерние элементы двух разных родителей.Я смог прочитать эту схему в DataSet, но DataSet фактически создал копию моего общего сложного типа, чтобы соответствовать реляционной модели.Схема XML, которую я выписал, не соответствует схеме, которую я прочитал.

Вы должны попытаться выписать схему, используя WriteXmlSchema, и сравнить ее со схемой, которую вы прочитали.

...