Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB删除不必要的嵌套XML标记_Java_Xml_Jakarta Ee_Jaxb_Javax.xml - Fatal编程技术网

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>