как указать внешнюю схему в processContents = lax - PullRequest
1 голос
/ 04 октября 2011

У меня есть общая схема, которая определяет раздел следующим образом:

<xs:element name="detail">
    <xs:annotation>
        <xs:documentation>
        </xs:documentation>
    </xs:annotation>    

    <xs:complexType>
        <xs:sequence>
            <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute processContents="skip"/>
    </xs:complexType>
</xs:element>

Я читал об этом материале большую часть дня, но все еще не могу понять, как перейти к полям, которые будут найдены в настоящем документе XML под элементом detail.

Я знаю, что это может выглядеть так:

<detail>
   <drawing>
      <name="test"/>
    </drawing>
</detail>

или

<detail>
   <icon>
      <icon_name="testIcon"/>
      <icon_image="iconImage.jpg"/>
    </icon>
</detail>

У xmlbeans нет способа узнать, что входит в элемент details, поскольку это подстановочный знак, поэтому он не дает мне возможности погрузиться в эти элементы. сайт xmlbeans указывал, что я изменил документ, который я прочитал, чтобы переместить элементы подстановки вверх на уровень, но это не выглядит обрезанным. Я мог бы также изменить схему, чтобы сделать элемент ref для элементов, которые могут быть там для моего конкретного кода. Мысли об этом?

1 Ответ

0 голосов
/ 10 января 2012

Поскольку элемент detail может содержать любой допустимый XML, вы можете либо использовать какой-либо общий способ доступа к содержимому (XPath, DOM-обход или аналогичный), либо специально попытаться сопоставить каждого дочернего элемента со специфической схемой (предпочтительно с использованием уникального Пространства имен). Затем дети, соответствующие известной схеме, могут быть переданы в вашу любимую библиотеку, которая генерирует объекты из XML.

Другим вариантом, как вы говорите, может быть указание каждого допустимого дочернего типа в схеме (необязательно с подстановочным знаком в нижней части для целей расширяемости).

...