2016-06-29 5 views
1

У меня есть предопределенная схема xsd (которую я не могу изменить к сожалению), для которой я хотел бы сгенерировать соответствующие классы JAVA через JAXB. В настоящее время я борюсь со сложным типом, который определяется следующим образом.JAXB Доступ к содержимому строки из anyType

<xsd:complexType name="AttributeType"> 
    <xsd:complexContent> 
     <xsd:extension base="xsd:anyType"> 
     <xsd:attribute name="id" type="xsd:anyURI" use="required"/> 
     <xsd:anyAttribute processContents="lax"/> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

Примеры XML предоставляемые, позволяют прямое содержимое строки, например:

<attribute id="myValue">201</attribute> 

, а также встроенный XML как это:

<attribute id="address"> 
    <example:Address xmlns:example="http://example.com/ns"> 
     <Street>100 Nowhere Street</Street> 
     <City>Fancy</City> 
     <State>DC</State> 
     <Zip>99999</Zip> 
    </example:Address> 
</attribute> 

При запуске процесса XJC без дальнейшего связывания модификация, я получаю такой класс:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "AttributeType", propOrder = { 
    "any" 
}) 
public class AttributeType { 

    @XmlAnyElement 
    protected List<Element> any; 
    @XmlAttribute(name = "id", required = true) 
    @XmlSchemaType(name = "anyURI") 
    protected String id; 
    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    // getter setter omitted 
} 

Проблема в том, что я не могу получить содержимое строки в первом примере. Это может ссылаться на XSD anytype and JAXB, но на самом деле я не знаю, чтобы достичь этого, не изменяя XSD. Итак, как я могу получить содержимое строки? Btw. Я использую maven cxf-codegen-plugin для генерации источника.

+0

Вы смогли решить проблему? Ссылка на ссылку [link] (https://stackoverflow.com/questions/3488141/xsd-anytype-and-jaxb) - это то же самое, что у меня есть, и я пытаюсь понять, как ее преодолеть. Ответы там не сработали. – JGlass

ответ

0

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

Если бы вы могли изменить ваш XSD, решение будет:

<xsd:complexType name="AttributeType"> 
    <xsd:complexContent mixed="true"> 
     <xsd:extension base="xsd:anyType"> 
     <xsd:attribute name="id" type="xsd:anyURI" use="required"/> 
     <xsd:anyAttribute processContents="lax"/> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

Но так как вы не можете ...

Если вы можете позволить себе изменить свой исходный код, изменение:

@XmlAnyElement 
protected List<Element> any; 

Для

@XmlAnyElement 
@XmlMixed 
protected List<Object> any; 

Список объектов должен содержать Element для дочернего элемента и String для текста.

+0

Изменение сгенерированного источника также не является лучшим решением здесь, поскольку XSD «часто» обновляются и, таким образом, генерируются в процессе сборки. Есть ли способ выполнить эту модификацию, возможно, путем привязки настроек? – Ingo

Смежные вопросы