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 отлично работает для сильных и четких структур, но если у вас смешанные вещи, вы получите странные модели, с которыми трудно работать. Я не могу предложить альтернативу, хотя.