XPath для оболочки сложного типа в элементе

#java #xml #xpath #jaxb

#java #xml #xpath #jaxb

Вопрос:

У меня есть следующий элемент, определенный в схеме XSD

 <xs:element name="MainType">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="InnerType">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="OtherType" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
  

Я хочу написать привязку для OtherType, но у меня проблемы с XPath. Я написал этот XPath для адресации OtherType.

 //xs:element[@name='MainType']//xs:complexType//xs:element[@name='InnerType']//xs:complexType//xs:element[@name='OtherType']
  

Я пытался пропустить complexType между элементами в XPath, но это также не работает. Плагин JAXB возвращает эту ошибку

 om.sun.istack.SAXParseException2: XPath evaluation of ... results in empty target node
  

Комментарии:

1. Самый внутренний атрибут, который вы ищете @ref='OtherType' , не @name?

2. Спасибо, я не заметил этой ошибки.

3. Это ответило на вопрос, т. Е. Можем ли мы закрыть как незначительную опечатку?

4. Als пересмотрит использование //

5. Все выражение XPath кажется мне довольно специфичным. Было //xs:element[@ref='OtherType'] бы достаточно или это действительно должно быть » xs:element[@ref='OtherType'] , только если потомок xs:element[@name='InnerType] , только если потомок xs:element[@name='MainType'] , только если потомок любого узла в документе» ?

Ответ №1:

Правильный XPath:

 //xs:element[@name='MainType']//xs:element[@name='InnerType//xs:element[@ref='OtherType']