Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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如何将列表的内容打包为单个标记_Java_Xml_Jaxb - Fatal编程技术网

Java JaxB如何将列表的内容打包为单个标记

Java JaxB如何将列表的内容打包为单个标记,java,xml,jaxb,Java,Xml,Jaxb,我使用JAXB作为marshaller 我有一个包含字符串和其他属性列表的对象。我想将列表内容整理为单个标记 我在代码中列出了项目。如果将字符串“apple”、“banana”、“orange”添加到列表中,则在编组生成的xml时,我希望: <items> <apple/> <banana/> <orange/> </items> 这可行吗??或者,为了得到这个结果,我必须如何改变这个对象 (很抱歉格式化,我做得

我使用JAXB作为marshaller

我有一个包含字符串和其他属性列表的对象。我想将列表内容整理为单个标记

我在代码
中列出了项目
。如果将字符串“apple”、“banana”、“orange”添加到列表中,则在编组生成的xml时,我希望:

<items>
   <apple/>
   <banana/>
   <orange/>
</items>

这可行吗??或者,为了得到这个结果,我必须如何改变这个对象

(很抱歉格式化,我做得太好了)

我的建议 我的建议是不要这样做。而是让您的XML消息如下(这将使每个人都更容易处理您的XML):

  • 使用指向
    XmlAdapter
    @xmlanyement
    注释的
    @XmlJavaTypeAdapter
    注释您的
    列表
    字段/属性

     import java.util.*;
     import javax.xml.bind.annotation.*;
     import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
     @XmlRootElement
     public class Items {
    
        private List<String> items = new ArrayList<String>();
    
        @XmlAnyElement
        @XmlJavaTypeAdapter(StringAdapter.class)
        public List<String> getItems() {
        return items;
        }
    
      }
    

  • 伟大的谢谢不幸的是,这样的XML对我来说是一种需求,而不是一种选择(这是其他人的选择!)…为了让其他读者了解完整性,为了完全获得预期结果,还需要将列表注释为@xmlementwrapper(name=“empty”)
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    
    public class StringAdapter extends XmlAdapter<Object, String> {
    
        private Document document;
    
        @Override
        public String unmarshal(Object v) throws Exception {
        Element element = (Element) v;
        return element.getTagName();
        }
    
        @Override
        public Object marshal(String v) throws Exception {
        return getDocument().createElement(v);
        }
    
        private Document getDocument() throws Exception {
        if(null == document) {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.newDocument();
        }
        return document;
        }
    
    }
    
     import java.util.*;
     import javax.xml.bind.annotation.*;
     import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
     @XmlRootElement
     public class Items {
    
        private List<String> items = new ArrayList<String>();
    
        @XmlAnyElement
        @XmlJavaTypeAdapter(StringAdapter.class)
        public List<String> getItems() {
        return items;
        }
    
      }
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Items.class);
    
        Items items = new Items();
        items.getItems().add("apple");
        items.getItems().add("banana");
        items.getItems().add("orange");
    
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setAdapter(new StringAdapter());
        marshaller.marshal(items, System.out);
        }
    
    }