JAXB: Как перечислить идентичные дочерние элементы с разными именами тегов - PullRequest
0 голосов
/ 13 июня 2018

У меня есть XML в следующем формате:

<servers>
      <server_1>
          <name>S1</name>
          <user>User1</user>
          <pass>pass1</pass>
      </server_1>
      <server_2>
          <name>S2</name>
          <user>User2</user>
          <pass>pass2</pass>
      </server_2>
      <server_3>
          <name>S3</name>
          <user>User3</user>
          <pass>pass3</pass>
      </server_3>
</servers>

На серверах может быть несколько дочерних элементов.И у меня возникли проблемы с выяснением, как разобрать их с помощью JAXB unmarshel.Если бы у ребенка было одинаковое имя, я мог бы просто разобрать его в списке.

Я также посмотрел на аннотацию @XMLAnyElement, которая позволила бы мне поместить эти элементы в список, но я столкнулся с некоторыми проблемами приведения типов, поскольку при этом возникает ElementNSImpl, а затем мне нужно преобразовать его в простой сервер.вступительный класс.Это единственный способ обработать такой случай?

Не могу ли я использовать регулярное выражение в поле имени @ XMLElement для заполнения таких записей, игнорируя различные теги (server_1, server_2 и т. Д.) Или любым другим способом игнорирования другого дочернего элементатеги элементов.

Я использовал это руководство для понимания поведения XMLAnyElement: http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html, но на самом деле это не для моего случая использования.

Другой подход, о котором я думализменив сам родительский xml и заменив теги типа server_X на сервер с помощью Java FileReaders, прежде чем разбирать XML-файл.

Буду признателен за помощь или за указание в правильном направлении.

Редактировать: я вижу, что следующий код работает -

    ..
    ..
     @XmlAnyElement
        public List<ElementNSImpl> getServer() {
            return server;
        }
    ..
    ..
public void printElem() {
        if(server!=null) {
            for(ElementNSImpl serverEntry :server) {
                NodeList nodeList= ftpEntry.getChildNodes();
                System.out.println("length:"+nodeList.getLength());
                for(int i=0;i<nodeList.getLength()-1;i++)
                    System.out.println(nodeList.item(i).getNodeName()+" :"+nodeList.item(i).getTextContent());
            }
        }
    }

Но Java выдает предупреждение об использовании ElementNSImpl напрямую:

Access restriction: The type 'ElementNSImpl' is not API (restriction on required library 'C:\Program Files (x86)\Java\jre1.8.0_171\lib\rt.jar')

Так что я не уверен, если этоможно использовать ElementNSImpl следующим образом.

...