2010-11-25 45 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 Web服务(并不意味着它无法完成)。 – 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; 
    } 

} 

然后在主法等方法,我会创建解组:

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(); 
      } 
     } 
相关问题