Нужна помощь в создании xsd

Я новичок в xsd. Я пытаюсь создать xsd, чтобы мой xml был следующим образом.

<Info>
            <Val name="n_1">A</Val>
            <Val name="n_2">123</Val>
            <Val name="n_3">2012-05-05T00:00:00</Val>          
</Info>

XSD, который я создал, таким образом.

<xs:element name="Info">
    <xs:complexType>
        <xs:sequence>
             <xs:element name="n_1" type="xs:string"/>
            <xs:element name="n_2" type="xs:integer"/>
            <xs:element name="n_3" type="xs:dateTime"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Это, очевидно, не помогло удовлетворить мои требования. Но в данный момент меня поразила одна вещь.. как создать 3 элемента "val", значение атрибута которых отличается... Даже если я как-то это сделаю, получит список ошибок списков .. как я могу с этим справиться?

На самом деле я пишу этот xsd, чтобы мои данные в excel можно было преобразовать в xml. Чтобы добавить что-то о моем excel, одна строка представляет собой набор, в котором один столбец - это информация (худшее происходит здесь: | поскольку у меня есть 3 Val's за одну информацию) ...

Сначала я подумал, что этот xml неверен, но я ошибся.. это стандартный вывод/ввод xml..

Любая помощь в достижении этого будет ощутимой.

Заранее спасибо.. :)


person NoviceCoder    schedule 20.04.2012    source источник
comment
Отредактировал вопрос в соответствии с изменением требований. Чтобы быть точным, я изменил тип значений атрибутов со строки на дату и время и т. Д.   -  person NoviceCoder    schedule 23.04.2012
comment
Пожалуйста, подумайте, каковы ваши фактические требования, и разместите вопрос, в котором это четко указано. Вы начали с (видимо) чего-то, а теперь у вас что-то другое.   -  person MiMo    schedule 23.04.2012
comment
Извините, мое требование изменилось сегодня, и я не знал об этом, когда публиковал вопрос.. Очень сожалею об этом.. И я очень ценю ваши усилия по решению моего вопроса.. Merci Beaucoup Monsieur :)   -  person NoviceCoder    schedule 23.04.2012


Ответы (3)


XSD должен быть примерно таким:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Info">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Val" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="name">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="n_1"/>
                      <xs:enumeration value="n_2"/>
                      <xs:enumeration value="n_3"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Он объявляет элемент Info, содержащий список подэлементов Val. Каждый элемент Val содержит строковые значения (<xs:simpleContent> и <xs:extension base="xs:string">), а также атрибут name, который имеет только три возможных значения n_1, n_2 и n_3.

В зависимости от ваших точных требований вы можете поиграть с типом содержимого Val - указать, например, что это строка с определенной максимальной длиной. Точно так же вы можете изменить ограничения на значения атрибута name (или не иметь ограничений)

person MiMo    schedule 20.04.2012
comment
Большое спасибо ... Я попробую это и вернусь к вам .. : D - person NoviceCoder; 21.04.2012
comment
эй, когда я пишу эти строки в Visual Studio, он говорит, что complexType в строке 5 не поддерживается в этом контексте. Кроме того, я не могу импортировать xsd в качестве источника для листа Excel. В любом случае спасибо :) - person NoviceCoder; 23.04.2012
comment
Mhh... Я написал XSD в Visual Studio и попробовал его в Excel, может быть проблема с вашим пространством имен? Я обновляю ответ, чтобы включить полный XSD, включая пространства имен. - person MiMo; 23.04.2012
comment
Спасибо за быстрый ответ.. :D На самом деле, после добавления elementFormDefault=qualified в схему все заработало.. :D Пожалуйста, дайте мне знать, как играть с n_1,n_2,n_3, потому что они есть в нашей схеме. не могу просмотреть их в excel после объявления его как источника. Кроме того, как я могу изменить их тип, я имею в виду, что n_1 - это строка, а n_2 - это dateTime или около того. еще раз за быстрый ответ :D - person NoviceCoder; 23.04.2012
comment
n_1, n_2 и т. д. являются возможными значениями атрибутов - другими словами, литералы слов, они не могут быть строками или датой-временем и т. д. Вы не можете объявить один и тот же атрибут несколькими разными типами. - person MiMo; 23.04.2012
comment
omg .. у вас есть какие-либо идеи относительно того, как я могу этого достичь ..? Я меняю свой вопрос в соответствии с этим. Я не могу использовать эту схему, когда я объявляю ее как источник в своем Excel, я мог видеть только имя и значение.. но у меня будет n_1, n_2, n_3 как 3 столбца в excel. Если я сопоставлю имя с n_1, я не смогу сопоставить его с какими-либо другими столбцами (n_2, n_3)... никогда не думал, что это так сложно..: | - person NoviceCoder; 23.04.2012
comment
Я не думаю, что можно определить элемент с тем же именем, но с другим типом контента в зависимости от значения атрибута - даже если это возможно, это не выглядит хорошей идеей - лучше иметь разные имена для разных элементов . - person MiMo; 23.04.2012
comment
да, я тоже так думаю - это не очень хорошая идея.. но я беспомощен в этом вопросе.. Мне нужно сгенерировать xml только таким образом.. :( В любом случае, мне нужно больше узнать о xsd так как я только что столкнулся с этим без основ из-за плотного графика. Если вы столкнетесь с какими-либо такими методами для достижения этого, пожалуйста, дайте мне знать.. Спасибо :) - person NoviceCoder; 23.04.2012

Попробуйте этот XSD. Он обеспечивает уникальность атрибута name узлов Val.

<?xml version="1.0" encoding="utf-8"?> <xs:schema   xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Info" >
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Val" maxOccurs="unbounded">
                <xs:complexType>
                            <xs:simpleContent >
                                <xs:extension base="xs:anySimpleType">
                                    <xs:attribute name="name" use="required" />
                                </xs:extension>
                            </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueNameForValList">
        <xs:selector xpath="Val" />
        <xs:field xpath="@name" />
    </xs:unique>
</xs:element> 

person Ahamed Mustafa M    schedule 20.04.2012
comment
Большое спасибо .. Я попробую и вернусь к вам .. :d - person NoviceCoder; 21.04.2012
comment
Эй, где мне указать имена атрибутов n_1, n_2, n_3, и я также могу изменить их типы.. один может быть строкой, а другой может быть dateTime.. Пожалуйста, дайте мне знать, как я могу этого добиться.. простите, если я я спрашиваю об основных вещах, но я только начал создавать xsd .. В любом случае спасибо :) - person NoviceCoder; 23.04.2012
comment
Пожалуйста, сделайте правильное утверждение. Вы хотите, чтобы тип атрибута был string/dateTime или содержимое в узле Val имело другой тип? - person Ahamed Mustafa M; 23.04.2012
comment
На самом деле, мое требование недавно изменилось. Я хочу, чтобы они были разных типов. Я внес эти изменения в вопрос, пожалуйста, проверьте его один раз.. Я не знаю, возможно это или нет, поскольку я совершенно новичок в xsd.. Спасибо :) и извините за беспокойство.. - person NoviceCoder; 24.04.2012
comment
Таким образом, содержимое элемента Val может быть строкой или dateTime. Имя атрибута по-прежнему уникально, верно? - person Ahamed Mustafa M; 24.04.2012
comment
Точно, более того, у меня есть данные в excel, и я использую этот xsd для преобразования этих данных в xml. Во всяком случае, я еще не добился этого, так как этот xml сложнее, чем ожидалось.. да, это так в xml, который Я показал в вопросе.. Мне нужно написать xsd, который преобразует лист excel с данными в xml, показанный в вопросе.. Спасибо.. - person NoviceCoder; 24.04.2012

Попробуйте этот XSD

<?xml version="1.0"?>
<xs:schema id="Info" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Info" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="Val" nillable="true">
      <xs:complexType>
        <xs:simpleContent msdata:ColumnName="Val_Text" msdata:Ordinal="1">
          <xs:extension base="xs:string">
            <xs:attribute name="name" type="xs:string" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    </xs:element>
  </xs:choice>
</xs:complexType>

person suhas khot    schedule 20.04.2012
comment
Большое спасибо ... Я попробую это и вернусь к вам .. : D - person NoviceCoder; 21.04.2012