Многослойный xmlElements - PullRequest
0 голосов
/ 05 июня 2018

Давайте предположим, что у меня есть этот класс, и я хочу сгенерировать XML-файл, используя JAXB

 public class Document{

    private String id;
    private Date signatureDate;

    here goes Constructor, getters and setters
}

Когда я генерирую XML-файл, я получаю что-то вроде этого

`<document>
    <id>id3</id>
    <signatureDate>1970-01-01T01:00:00+01:00</signatureDate>
</documento>`

Теперь я хочуобернуть каждый атрибут класса большим количеством элементов: например, чтобы указать тип атрибутов.

`<document>
    <id>
        <paperid>
            <string>id3<string>
        <paperid>
    <id>
    <signatureDate>
        <signatureYearDayAndHour>
             <date>1970-01-01T01:00:00+01:00</date>
        </signatureYearDayAndHour>
    </signatureDate>
</documento>`

Конечная цель - обернуть каждый атрибут класса другим xmlElement.

1 Ответ

0 голосов
/ 05 июня 2018

Я не верю, что вы можете использовать JAXB для применения пользовательских правил мета-сопоставления, подобных вашим.JAXB определяет свои собственные конкретные правила отображения XML / POJO и поддерживает только тип Java, пространство имен и другие относительно простые настройки, описанные в официальных документах для файла bindings.xjb и инструмента xjc.

Что вы можетеОднако нужно настроить конвейер синтаксического анализа XML на применение фильтрации до того, как события XML попадут в демаршаллинг JAXB.Вот как вы можете подключить свой пользовательский фильтр в JAXP:

JAXBContext jc = JAXBContext.newInstance(Document.class);
XMLFilter filter = new MyFilter();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
filter.setParent(sp.getXMLReader());
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler =
  unmarshaller.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
filter.parse(inputsource);

Вот так может выглядеть реализация универсального фильтра (обратите внимание, что это просто действует как фильтр идентификации; я оставил реализацию вашего пользовательского отображенияправила как упражнение:)

class MyFilter extends XMLFilterImpl {

  @Override
  public void startElement(String uri, String localName, String qName, Attributes atts)
  throws SAXException {
    super.startElement(uri, localName, qName, atts);
  }

  @Override
  public void endElement(String uri, String localName, String qName)
  throws SAXException {
    super.endElement(uri, localName,  qName);
  }
}

Чтобы дать вам представление о том, что возможно с фильтрами, см., например.https://www.ibm.com/developerworks/community/forum/html/topic?id=60ef4f89-701a-447a-9375-3880115eb65a и http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html.

Наконец, обратите внимание, что для аннотирования элементов XML информацией о типе существует установленное соглашение об использовании атрибута xsi:type, поэтому вы можете захотеть использовать егои измените свой дизайн, а не придумайте свои собственные правила отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...