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;
// ...
}