我有一个 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/