如何使用Java为数据样本生成具有现有dtd的xml文件



我有一些数据存储在:中

HashMap<Position, Double> listOfPoints = new HashMap<>();

其中键包含对(x,y(。

我还定义了我的dtd文件generated.dtd,其中包含我的结构:

<!ELEMENT table (point*,id,position,x,y,value)>
<!ELEMENT point (id,position,value)>
<!ELEMENT id (ID)>
<!ELEMENT position (x,y)>
<!ELEMENT value (#PCDATA)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>

使用该文件和存储在listOfPoints中的数据示例,我想生成一个与我生成的.dtd结构相对应的xml文件

我怎么能在Java中做到这一点?

如果你有一个教程,它将是伟大的。

我现在应该使用JAXB:Java体系结构进行XML绑定,但我不知道怎么做?

几个观察/建议:

1( 您需要什么样的XML输出

假设您有一个Points类,如下所示:

import java.util.Map;
import java.util.HashMap;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "root")
public class Points {
public Points() {};
public Points(Map<Position, Double> listOfPoints) {
this.listOfPoints = listOfPoints;
}
@XmlElement(name = "list_of_points")
private Map<Position, Double> listOfPoints;
public Map<Position, Double> getListOfPoints() {
if (listOfPoints == null) {
listOfPoints = new HashMap();
}
return this.listOfPoints;
}
}

和像这样的Position类:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "position")
public class Position {
@XmlElement(required = true)
protected String x;
@XmlElement(required = true)
protected String y;
public String getX() {
return x;
}
public void setX(String value) {
this.x = value;
}
public String getY() {
return y;
}
public void setY(String value) {
this.y = value;
}
}

在不使用DTD的情况下,您可以生成这样的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<listOfPoints>
<entry>
<key>
<x>pos1 x</x>
<y>pos1 y</y>
</key>
<value>123.456</value>
</entry>
<entry>
<key>
<x>pos2 x</x>
<y>pos2 y</y>
</key>
<value>456.789</value>
</entry>
</listOfPoints>
</root>

这样做的代码是:

JAXBContext jc = JAXBContext.newInstance(Points.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
File xml = new File("/path/to/points.xml");
marshaller.marshal(points, xml);

这足以满足你的需要吗?

2( 使用DTD

我不确定DTD将如何帮助您,因为它意味着一组不相关且重叠的Java对象,最终的XML将从这些对象中创建。

要明白我的意思,你自己试试看。

使用xjc工具(请参阅此处(,您可以从DTD:生成Java对象

/path/to/jdk/bin/xjc -d output -p org.ajames.jaxbdemo.points -dtd my_schema.dtd

使用这些Java类,您可以填充数据结构(listOfPoints(。然后您可以从中创建XML输出(如上所示,使用JAXB整理器(。

但是DTD会创建一些不太有用的对象。。。

所以,这又回到了最初的问题:您希望XML看起来像什么

3( 使用XSD

如果手动创建所需XML的示例,则可以从中生成XSD。然后可以再次使用xjc命令(但这次是针对XSD而不是DTD(。然后,您可以使用生成的Java对象来获得所需的确切XML。

最新更新