JAXB Множественный контент для элемента

В настоящее время я работаю над проектом txt-to-xml. По сути, я делаю разные XmlElements для некоторого контента. Я получил и запустил DTD, и на данный момент я создаю xml по умолчанию, просто чтобы убедиться, что каждый созданный xml является действительным xml (для данного DTD). В основном я создаю новые классы для каждого элемента, у которого нет структуры #PCDATA, и пока он работает довольно хорошо. Теперь я борюсь с проблемой: я получил следующее в своем DTD:

<!ELEMENT REACTION(#PCDATA | ACTOR*)>

То, что я ищу в моем тексте, выглядит примерно так:

Проф. Х хлопнул в ладоши!

и я хочу извлечь это в мой XML как:

<REACTION>
  <ACTOR>Prof. X</ACTOR> clapped!
</REACTION>

Итак, что я в основном хочу, так это String-Attribute в ReactionClass, который называется XML-элементом, но содержит Actor-Attribute + остальную часть текста. Я думал о чем-то вроде:

String m_sText;
String m_sActor;

public ReactionClass(){ 
 this.Actor = "Prof. X";
 this.sText = this.m_sActor + " clapped!";
}

@XmlElement(name = "TEXT")
public String getM_sText(){ return this.m_sText; }

@XmlElement(name = "ACTOR")
public String getM_sActor(){ return this.m_sActor; }

Для всех других узлов, таких как RootNode, я создал RootNodeClass, который содержит различные атрибуты, такие как m_nLocation, m_nTime, m_nYear, которые объявлены как XML-элементы, поэтому JAXB-Marshaller просто создает XML на основе этих элементов:

<ROOT>
 <TIME>09:00</TIME>
 <LOCATION>New York</TIME>
 <YEAR>1992</YEAR>
</ROOT>

Я хотел сделать то же самое с узлом REACTION (как упомянуто выше), но при создании нового класса REACTION я получаю sth. лайк:

<REACTION>
  <TEXT>Prof. X clapped!</TEXT>
  <ACTOR>Prof. X</ACTOR>
</REACTION>

Как бы я поместил их в один элемент, но сохранил бы теги, как указано выше? Если бы у кого-нибудь появилась идея, как с этим справиться, я был бы очень благодарен!

Спасибо Макс

1 ответ

Решение

Во-первых, то, что вам, скорее всего, нужно @XmlMixed, Вы, вероятно, будете иметь такую ​​структуру:

@XmlMixed
@XmlElementRefs({
    @XmlElementRef(name="ACTOR", type=JAXBElement.class),
    ...})
List<Object> content;

С этим вы могли бы поставить там String с и JAXBElement<Actor> добиться так называемого смешанного контента.

Затем вы можете сначала рассмотреть возможность преобразования своего DTD в XML-схему и его компиляции - или компиляции DTD с помощью XJC.

Наконец, у вас есть так называемые "полуструктурированные данные", которые, я думаю, не совсем подходят для JAXB. JAXB отлично работает для сильных и четких структур, но если у вас смешанные вещи, вы получите странные модели, с которыми трудно работать. Я не могу предложить альтернативу, хотя.

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