2012-11-05 104 views
1

我试图使用JAXB解析以下XML。我删除了不相关的部分。不幸的是原始的XML由第三方应用程序生成,我没有DTDXSD文件可用,所以我正在手动构建我的JAXB代码。jaxb中的两个不同但命名相同的元素

<add> 
    <add-attr attr-name="UserName"> 
    <value type="string">User1</value> 
    </add-attr> 
    <add-attr attr-name="Name"> 
    <value type="structured"> 
     <component name="familyName">Doe</component> 
     <component name="givenName">John</component> 
    </value> 
    </add-attr> 
</add> 

问题当然是<value>元素。这可以是纯文本元素,或者如果它的属性类型是“结构化,<component>元素的列表。

我已经创建了两个类(值1和值2)实现了这个两个选项,但我不能告诉JAXB这一个使用,因为元素都被命名为“价值”请问有什么解决

回答

2

选项#1 - ?一个值类

你可以有一个Value类,包括String属性与@XmlMixed注解。

package forum13232991; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Value { 

    @XmlAttribute 
    String type; 

    @XmlMixed 
    List<String> value; 

    @XmlElement(name="component") 
    List<Component> components; 

} 

选项#2 - 多值类通过XmlAdapter

如果你想他们是独立的类,你可以利用此一XmlAdapter

ValueAdapter

package forum13232991; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class ValueAdapter extends XmlAdapter<Value, Object> { 

    @Override 
    public Value marshal(Object object) throws Exception { 
     Value value = new Value(); 
     if(object instanceof StructuredValue) { 
      StructuredValue structuredValue = (StructuredValue) object; 
      value.type = "structured"; 
      value.components = structuredValue.components; 
     } else { 
      StringValue stringValue = (StringValue) object; 
      value.value.add(stringValue.value); 
     } 
     return value; 
    } 

    @Override 
    public Object unmarshal(Value value) throws Exception { 
     if("string".equals(value.type)) { 
      StringValue stringValue = new StringValue(); 
      StringBuilder strBldr = new StringBuilder(); 
      for(String string : value.value) { 
       strBldr.append(string); 
      } 
      stringValue.value = strBldr.toString(); 
      return stringValue; 
     } else { 
      StructuredValue structuredValue = new StructuredValue(); 
      structuredValue.components = value.components; 
      return structuredValue; 
     } 
    } 

} 

AddAttr

package forum13232991; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

public class AddAttr { 

    @XmlJavaTypeAdapter(ValueAdapter.class) 
    Object value; 

} 

更多信息

1

一种方法是创建其中加入一个xsi XSL转换:type属性的基于类型属性的值元素。您的所有Value元素都可以从相同的BaseValue类扩展,add-attr元素可以引用此BaseValue。

+0

+1 - 您也可以使用SAX'XmlFilter'来添加'xsi:type'属性:http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html –

相关问题