2010-11-25 1 views
4

У меня есть XML, который не контролирует, как он сгенерирован. Я хочу создать объект из него, разобрав его в класс, написанный мной.Элементы сопоставления JAXB с «неизвестным» именем

Один фрагмент его структуры выглядит следующим образом:

<categories> 
    <key_0>aaa</key_0> 
    <key_1>bbb</key_1> 
    <key_2>ccc</key_2> 
</categories> 

Как я могу справиться с такими случаями? Конечно, количество элементов переменной.

+0

ли структура XML имеют четко определенные схемы? – 2010-11-25 15:44:41

+0

№ Источник - это веб-сервис PHP REST (который не подразумевает, что это невозможно). – bbcooper 2010-11-25 18:14:00

ответ

5

Если вы используете следующую объектную модель, то каждый из неотображенных KEY_ # элементы будут храниться как экземпляр org.w3c.dom.Element:

import java.util.List; 
import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import org.w3c.dom.Element; 

@XmlRootElement 
public class Categories { 

    private List<Element> keys; 

    @XmlAnyElement 
    public List<Element> getKeys() { 
     return keys; 
    } 

    public void setKeys(List<Element> keys) { 
     this.keys = keys; 
    } 

} 

Если какой-либо из элементов соответствует классам, сопоставленным с аннотацией @XmlRootElement, вы можете использовать @XmlAnyElement (lax = true), и известные элементы будут преобразованы в соответствующие объекты. Для примера см:

0

Для этого простого элемента, я хотел бы создать класс под названием Категории:

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Categories { 

    protected String key_0; 
    protected String key_1; 
    protected String key_2; 

    public String getKey_0() { 
     return key_0; 
    } 

    public void setKey_0(String key_0) { 
     this.key_0 = key_0; 
    } 

    public String getKey_1() { 
     return key_1; 
    } 

    public void setKey_1(String key_1) { 
     this.key_1 = key_1; 
    } 

    public String getKey_2() { 
     return key_2; 
    } 

    public void setKey_2(String key_2) { 
     this.key_2 = key_2; 
    } 

} 

Затем в основной метод или около того, я бы создать unmarshaller:

JAXBContext context = JAXBContext.newInstance(Categories.class); 
Unmarshaller um = context.createUnmarshaller(); 
Categories response = (Categories) um.unmarshal(new FileReader("my.xml")); 
// access the Categories object "response" 

Чтобы быть в состоянии я хочу, чтобы все элементы внутри корневого элемента были добавлены в новый xml-файл и я написал класс для этого корневого элемента с аннотацией @XmlRootElement.

Надежда, что помогает, mman

+0

+1, но вам не нужно указывать имя в XmlRootElement, поскольку оно будет по умолчанию «категориями», также вам не нужно комментировать @XmlElement, поскольку он по умолчанию. – 2010-11-25 15:56:04

0

Используйте как этот

 @XmlRootElement 
     @XmlAccessorType(XmlAccessType.FIELD) 
     public static class Categories { 


      @XmlAnyElement 
      @XmlJavaTypeAdapter(ValueAdapter.class) 
      protected List<String> categories=new ArrayList<String>(); 

      public List<String> getCategories() { 
       return categories; 
      } 
      public void setCategories(String value) { 
       this.categories.add(value); 
      } 
     } 

     class ValueAdapter extends XmlAdapter<Object, String>{ 

      @Override 
      public Object marshal(String v) throws Exception { 
       // write code for marshall 
      return null; 
      } 

      @Override 
      public String unmarshal(Object v) throws Exception { 
       Element element = (Element) v; 
       return element.getTextContent(); 
      } 
     }