как указать внешнюю схему в processContents = lax

#java #xml #xsd #xmlbeans

#java #xml #xsd #xmlbeans

Вопрос:

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

 <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 указывал, что я изменяю документ, который я прочитал, чтобы переместить подстановочные элементы на уровень выше, но это не кажется простым и сухим.
Я мог бы также изменить схему, чтобы сделать ссылку на элементы для элементов, которые могут быть там для моего конкретного кода. Мысли по этому поводу?

Ответ №1:

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

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