Ранее я задавал вопрос о маршаллинге элемента jdom.Я никогда не получал это работать, поэтому я переключился на использование объекта Java вместо этого.Это позволило мне почти заставить мою программу работать.Однако я сталкиваюсь с последним препятствием.
Итак, в этом классе я пытаюсь выполнить маршалинг. У меня есть следующее поле:
@XmlRootElement(name = "ReportElement")
class ReportElement{
More fields....
@XmlElement(name = "Content", namespace = "some:name:space:1")
Object content
}
Для содержимого будет задан класс, который имеет следующий корневой элемент:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ContentInfoType", propOrder = [
order here
])
@XmlRootElement(name = "ContentInfo", namespace = "some:name:space:2")
class ContentInfoType implements ReportProperty {
Маршал все, как я хочу, кроме этого бита:
<ns5:Content xsi:type="ns2:ContentInfoType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Все поля ContentInfoType установлены правильно, но я не понимаю, почему мой корневой элемент ContentInfoType не устанавливаетсякак XML-узел, подобный следующему:
<ns2:ContentInfo></ContentInfo>
Вот мой код сортировки:
static <T> Element serializeGenericObjectToXmlTypeElement(T object, boolean removeDeclaration = false, List<String> objectList = []) {
JAXBContext jc
if(objectList.size() != 0){
String packageString = object.getClass().getPackage().getName()
for(String s : objectList){
packageString += ":" + s
}
jc = JAXBContext.newInstance(packageString)
} else{
jc = JAXBContext.newInstance(object.getClass())
}
Marshaller marshaller = jc.createMarshaller()
if (removeDeclaration) {
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true)
}
Writer writer = new StringWriter()
marshaller.marshal(object, writer)
def xmlString = writer.toString()
def stringReader = new StringReader(xmlString)
def builder = new SAXBuilder()
def doc = builder.build(stringReader)
def elem = doc.getRootElement()
MyXMLFormatter xmlFormatter = new MyXMLFormatter(elem)
Element element2 = xmlFormatter.formatXml(elem)
return element2
}
Всякий раз, когда мне нужно упорядочить более одного класса, я отправляю список с именами пакетов:классы, которые необходимо упорядочить.
Вы можете игнорировать MyXMLFormatter.Это уже на
marshaller.marshal(object, writer)
То, что вывод не то, что я желаю.
Кто-нибудь есть какие-либо идеи о том, почему поведение такое, как оно есть?
PS: Если я маршал ContentInfoType один (у меня есть сценарий, где мне нужен только XML этого), он работает нормально, и я получаю элемент XML с ContentInfo.Но когда ContentInfoType устанавливается в «Содержимое объекта», из моего класса ReportElement это не работает.
РЕДАКТИРОВАТЬ: я только что сделал редактирование, так как я не получил все аннотации моего класса contentinfotype.Возможно, причина этого в аннотации @XmlType.