Проблема схемы: Можно определить тип элемента ИЛИ добавить атрибут элемента, но не оба. Я хочу оба! - PullRequest
2 голосов
/ 12 ноября 2009

Я унаследовал задачу создания схемы для некоторого XML, который уже существует - и ИМХО не самое лучшее, что можно было бы сделать. Раздел, в котором описаны проблемы, является элементом в конце элемента scan-result.

Лучшее, на что я надеюсь в отношении данных в элементе spectrum, - это обрабатывать их как type = "xs: string". Я программно разделю числовые пары, которые составляют данные в строке позже. (Хотя этот шаг не понадобился бы, если бы данные были правильно структурированы в первую очередь.)

Вот кусок XML-данных, с которым мне приходится работать ...

    <scan-result>
      <spectrum-index>0</spectrum-index>
      <scan-index>2</scan-index>
      <time-stamp>5609</time-stamp>
      <tic>55510</tic>
      <start-mass>22.0</start-mass>
      <stop-mass>71.0</stop-mass>
      <spectrum count="5">30,11352;31,360;32,16634;45,1161;46,26003</spectrum>
    </scan-result>

Проблема в том, что я не могу получить рабочее определение для элемента «спектр», который имеет атрибут «count» и позволяет мне определить тип элемента «спектр» как «xs: string».

Я хотел бы что-то вроде следующего:

<xs:complexType name="ctypScanResult">
    <xs:sequence>
        <xs:element name="spectrum-index" type="xs:integer"/>
        <xs:element name="scan-index" type="xs:integer"/>
        <xs:element name="time-stamp" type="xs:integer"/>
        <xs:element name="tic" type="xs:integer"/>
        <xs:element name="start-mass" type="xs:float"/>
        <xs:element name="stop-mass" type="xs:float"/>
        <xs:element name="spectrum" type="xs:string">
            <xs:complexType>
                <xs:attribute name="count" type="xs:integer"/>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
    <xs:attribute name="count" type="xs:integer"/>
</xs:complexType>

Проблема в том, что я могу определить тип элемента «спектр» как «xs: string» XOR Я могу определить анонимный «xs: complexType» в элементе «спектр», что позволяет мне вставить «счетчик» атрибут. Но мне нужно уметь выразить и то, и другое.

Учитывая, что я как бы застрял с XML, каким он был передан мне, есть ли определение схемы, которое позволит мне описать эти данные?

Извините, это долго, но спасибо всем, кто откликнется,

AlarmTripper

Продолжение: я знаю, почему возникает ошибка ...

Цитируется по W3C:

3.3.3 Ограничения на XML-представления объявлений элементов Ограничение представления схемы: представление объявления элемента OK

В дополнение к условиям, налагаемым на элементы информации об элементе схемами для схем: должно выполняться все следующее: 1 default и fixed не должны присутствовать оба. 2 Если родитель элемента не является, тогда все следующее должно быть верно: 2.1 Должен присутствовать один из ref или name, но не оба. 2.2 Если ref присутствует, тогда все,,,,, nillable, default, fixed, form, block и type должны отсутствовать, то есть только minOccurs, maxOccurs, id допускаются в дополнение к ref вместе с. 3 типа и либо либо являются взаимоисключающими. 4 Соответствующие объявления частиц и / или элементов должны удовлетворять условиям, изложенным в Ограничениях на компоненты схемы объявления элементов (§3.3.6) и Ограничениях на компоненты схемы частиц (§3.9.6).

Но я все еще нахожусь в том же состоянии, что и раньше ... Как я могу на самом деле выполнить то, что напоминает мою цель?

Спасибо

AlarmTripper

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Пусть инструмент сделает это за вас! Попробуйте xsd.exe .

Или, если вам нужно определить вручную, по крайней мере, проверьте собственноручное определение с автоматически сгенерированным.

Вот что XSD.exe дал мне для вашего ввода. Я подстриг немного MS-NS.

<xs:element name="spectrum">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="count" type="xs:string" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
</xs:element>
1 голос
/ 12 ноября 2009
<xs:element name="spectrum" type="xs:string">
  <xs:complexType>
    <!-- ADD THIS NEXT LINE -->
    <xs:complexContent mixed="true"/>
    <xs:attribute name="count" type="xs:integer"/>
  </xs:complexType>
</xs:element>
1 голос
/ 12 ноября 2009

Вам необходимо установить атрибут mixed="true" на complexType:

<xs:element name="spectrum">
  <xs:complexType mixed="true">
    <xs:attribute name="count" type="xs:integer" />
  </xs:complexType>
</xs:element>

РЕДАКТИРОВАТЬ : Хорошо, просто прочитайте ваш комментарий, извините. Я считаю, что следующее должно работать вместо:

<xs:element name="spectrum">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="count" type="xs:integer" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...