JAXB XML-тег в файле, начиная с номера, возможно?

У меня очень большой XML со многими вложенными тегами, для которых я создал класс Java.

Один из тегов начинается с номера <3DSecure></3DSecure>

Мне пришлось вручную установить только этот тег, в Java я сопоставлен с threeDSecure,

Я знаю, что это противоречит правилам XML, но возможно ли переопределить эту проверку? В противном случае мне придется отказаться от JAXB и настроить xml вручную, потому что я не контролирую API, который ожидает этот XML.

При демаршаллинге / маршаллинге я получаю ошибку:

[org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:505)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:206)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169)

2 ответа

Вы можете использовать -nv флаг, отключить проверку схемы XML при генерации классов из схемы XML.

XJC Call

xjc -nv schema.xsd 

Схема XML (schema.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema"
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <complexType name="foo">
       <sequence>
           <element name="3DSecure" type="string"/>
       </sequence>
    </complexType>

</schema>

Генерируемый класс (Foo)

package org.example.schema;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo", propOrder = {"_3DSecure"})
public class Foo {

    @XmlElement(name = "3DSecure", required = true)
    protected String _3DSecure;

    public String get3DSecure() {
        return _3DSecure;
    }

    public void set3DSecure(String value) {
        this._3DSecure = value;
    }

}

Свяжите свой класс Java с помощью атрибута имени аннотации @XmlElement как

 @XmlRootElement
 public class JAXBModel {

     @XmlElement(name="3DSecure")
     public String threeDSecure;

     // ...
 }
Другие вопросы по тегам