Java JAXB删除不必要的嵌套XML标记
目前,我的程序有以下输出:Java JAXB删除不必要的嵌套XML标记,java,xml,jakarta-ee,jaxb,javax.xml,Java,Xml,Jakarta Ee,Jaxb,Javax.xml,目前,我的程序有以下输出: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <container> <elements> <property name="e1"> <foo name="Alex" status="Married"/> </property> <property
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container>
<elements>
<property name="e1">
<foo name="Alex" status="Married"/>
</property>
<property name="e2">
<foo name="Chris" status="Married with 2 children"/>
</property>
</elements>
</container>
如何从输出中删除
标记
编辑:我找到了“肮脏”的方法-为
容器设置@XmlRootElement(name=“”)
。但是有什么“优雅”的方法吗?除了通过将元素名“黑客”改为“”来删除标记之外,我认为如果没有嵌套的标记,您将无法使用该数据类型
标记描述了包含已调整类的数据类型,您已将该类注释为名为elements
的XML元素,该元素包含适配器定义的属性
如果您想要更接近我认为您所追求的内容,请更改根类的上下文,或者可以在容器类中使用列表
而不是哈希映射
。需要XML元素
将封闭的元素sequence与属性映射元素
相关联。您不能放弃它:解组器如何知道
元素在元素
级别上属于何处
拥有列表
是不同的,因为JAXB将重复元素x“硬连线”处理为列表x
,所以不需要包装器
由于使用注释编写Java类,因此可以通过添加(到容器)另一个“虚拟”字段并修改一些注释来使用它:
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Container {
// ...
@XmlTransient
public Map<String,Foo> getElements(){
return elements;
}
private List<Property> property;
@XMLElement
public List<Property> getProperty(){
List<Property> props = elements.entrySet().stream()
.map( e -> new Property( e.getKey(), e.getValue() )
.collect( Collectors.toList() );
return props;
}
@xmlacessortype(xmlacesstype.PROPERTY)
公营货柜{
// ...
@XmlTransient
公共映射getElements(){
返回元素;
}
私有财产清单;
@XMLElement
公共列表getProperty(){
List props=elements.entrySet().stream()
.map(e->新属性(e.getKey(),e.getValue())
.collect(Collectors.toList());
返回道具;
}
旧的Javas也可以
List<Property> props = new ArrayList<>();
for( Map.Entry<String,Foo> e: elements.entrySet() ){
props.add( new Property( e.getKey(), e.getValue() ) );
}
return props;
List props=new ArrayList();
对于(Map.Entry e:elements.entrySet()){
添加(新属性(e.getKey(),e.getValue());
}
返回道具;
该封送员如下所示:
<container>
<property name="aaa">
<foo name="aaaname" status="aaastatus"/>
</property>
<property name="bbb">
<foo name="bbbname" status="bbbstatus"/>
</property>
</container>
它没有解包!我忘了提到我使用的是Java 7-。stream()
是较新Java的一部分。请您为较旧的Java版本重写代码好吗?抱歉,一定错过了您的注释-添加了较旧的代码。映射
映射到了列表,请检查我编写的适配器。这是什么意思“更改根类的上下文”?我知道您的映射映射到了一个列表实现(这就是在元素标记中为您提供所需行为的原因),您的问题是,根类中的映射有一个与之关联的根元素,这就是为什么您会得到您不想要的标记。我所说的更改根类上下文的意思是,找出Container
是否是它的适当名称。它是多余的吗?一个容器
可能有很多东西,其中元素ts
就是其中之一。您是否尝试过将映射
适配到具有列表
的包装器对象,而不是将其适配到列表
,而无需插入适配foo
?
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Container {
// ...
@XmlTransient
public Map<String,Foo> getElements(){
return elements;
}
private List<Property> property;
@XMLElement
public List<Property> getProperty(){
List<Property> props = elements.entrySet().stream()
.map( e -> new Property( e.getKey(), e.getValue() )
.collect( Collectors.toList() );
return props;
}
List<Property> props = new ArrayList<>();
for( Map.Entry<String,Foo> e: elements.entrySet() ){
props.add( new Property( e.getKey(), e.getValue() ) );
}
return props;
<container>
<property name="aaa">
<foo name="aaaname" status="aaastatus"/>
</property>
<property name="bbb">
<foo name="bbbname" status="bbbstatus"/>
</property>
</container>