java - 如何使用 Java 为数据样本生成具有现有 dtd 的 xml 文件
问题描述
我有一些数据存储在:
HashMap<Position, Double> listOfPoints = new HashMap<>();
其中 key 包含对 (x,y)。
我还定义了名为 generate.dtd 的 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 中的数据样本,我想生成一个与我的 generated.dtd 结构相对应的 xml 文件。
我怎么能在 Java 中做到这一点?
如果您有教程可以学习,那就太好了。
我知道我应该使用 JAXB:用于 XML 绑定的 Java 架构,但我不知道如何使用?
解决方案
一些观察/建议:
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。
推荐阅读
- unix - 如何使用 SED/AWK 将文本文件中的第一行与最后一行交换
- .net - 将 .NET 核心项目引用到 WCF 时出错
- angular - ngrx store.dispatch 是否可以被限制/去抖动,或者 ngrx 操作是否可以被限制/去抖动?
- reactjs - Getiing 错误 TypeError:使用 React-router 时未定义历史记录
- hibernate - 在 Hibernate 中,我可以从 FetchType.EAGER 交换到 FetchType.LAZY 而不进行任何编码更改
- google-calendar-api - 使用谷歌日历事件 API 一次性在多个与会者日历上添加事件
- grpc - C# gRPC 客户端 - 名称解析失败
- javascript - 如何在输入时将文本拖到拖动位置
- google-chrome-extension - 实现自定义协议处理程序
- android - Android背景图片对性能的影响