java - 如何使用 JAXB 在 java 中创建另一个元素?

标签 java xml jaxb parent-child

我有一个 java 代码,用于使用 JAXB 创建 XML 文件,我知道如何创建根元素和元素,但我想从这样的元素创建子元素:

    <root element>
        <element>
               <child element>
               <group of elements and attributes>
               </child element>
        </element>
    </root element>

我现在只知道如何创建这样的:

    <XmlSource URL="http://local.yahoo.com/rss/restaurants?csz=Cairo,+CA">
        <hostName>local.yahoo.com</hostName>
        <parameters>
            <entry>
                <key>csz</key>
                <value>Cairo,+CA</value>
            </entry>
        </parameters>
        <urlPath>/rss/restaurants</urlPath>
    </XmlSource> 

那么,如果我想将参数放入主机名中,我该怎么做:

<XmlSource URL="http://local.yahoo.com/rss/restaurants?csz=Cairo,+CA">
    <hostName name="local.yahoo.com">
             <parameters>
                <entry>
                    <key>csz</key>
                    <value>LosAngelos,+CA</value>
                </entry>
            </parameters>
   </hostName>
    <urlPath>/rss/restaurants</urlPath>
</XmlSource>

最后这是我使用的java代码:

我添加注释的类:

       @XmlRootElement(name= "Source")
       public class XmlConf {

    @XmlElement(name= "Source")

    private URL url;
    private List<String> path = new ArrayList<String>();
    private String urlp;
    private Map<String, String> parameters;
    private String host;


    public URL getUrl() {
        return url;
    }
    @XmlAttribute(name = "URL")
    public void setUrl(URL url) {
        this.url = url;
    }
    @XmlElement
    public List<String> getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path.add(path);
    }
    @XmlElement
    public void setUrlPath(String urlp){
        this.urlp = urlp;
    }
    public String getUrlPath(){
        return urlp;
    }
    @XmlElement(name = "param")
    public void setParameters(Map<String, String> parameters){
        this.parameters = parameters;
    }
    public Map<String, String> getParameters(){
        return parameters;
    }
    public void setHostName(String host){
        this.host = host;
    }
    public String getHostName(){
        return host;
    }
      }

我使用 JAXB 的类:

    public class ConfList {

    private static final String fileName = "Source.xml";
    List<String> xmlConfList;
    private Object object;

    public ConfList(Object object){
        this.object = object;
    }

    public void addToList() throws IOException, JAXBException {

        File file = new File(object+fileName);
        JAXBContext jaxbContext = JAXBContext.newInstance(XmlConf.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(object, file);
        jaxbMarshaller.marshal(object, System.out);

    }
      }

最佳答案

您希望生成的 XML 具有所谓的混合内容。混合内容是指元素(hostName)同时具有文本(local.yahoo.com)和元素(parameters)内容。

<XmlSource URL="http://local.yahoo.com/rss/restaurants?csz=Cairo,+CA">
    <hostName>local.yahoo.com
        <parameters>
            ...
        </parameters>
    </hostName>
</XmlSource>

这可以通过 JAXB 与 @XmlMixed 注释进行映射,其中文本和元素内容进入一个列表,但这可能不是您想要的。像这样的东西怎么样?

<XmlSource URL="http://local.yahoo.com/rss/restaurants?csz=Cairo,+CA">
    <host name="local.yahoo.com">
        <parameters>
            ...
        </parameters>
    </host>
</XmlSource>
<小时/>

更新

yes, y're right, my bad, i was looking for that form not the one i wrote. how can i make it?

注意:我是EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导者和成员专家组。

您可以针对此用例利用 MOXy 的 @XmlPath 扩展:

import java.net.URL;
import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name = "XmlSource")
@XmlType(propOrder={"parameters", "urlp", "path"})
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlConf {

    @XmlAttribute(name="URL")
    private URL url;

    private List<String> path = new ArrayList<String>();

    @XmlElement(name="urlPath")
    private String urlp;

    @XmlPath("hostName/parameters")
    private Map<String, String> parameters;

    @XmlPath("hostName/@name")
    private String host;

}

了解更多信息

关于java - 如何使用 JAXB 在 java 中创建另一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16710906/

相关文章:

java - 在 HBase 中使用带有开始行、结束行和过滤器的扫描

java - 如何使用 Java 将 HTML 网页转换为 PDF 文件

xml - 如何使用父节点对象、在 JScript 中使用 XML 查询来选择具有特定属性值的特定子节点?

java - JAXB 解码返回属性的 null

java - java 中两次测试运行之间的 jprofiler 开销

jaxb - JAXB (MOXy) 中 XML 的部分映射

java - 单击按钮时新 Intent 未启动

java - 如何在java中获取另一个JPanel内部的JPanel组件

python - GAE(Python 版本)性能最佳的 xml 解析是什么?

java - Jaxb 不保留包中命名空间的大小写