Java 中的动态 XML 创建

Posted

技术标签:

【中文标题】Java 中的动态 XML 创建【英文标题】:Dynamic XML creation in Java 【发布时间】:2011-10-16 00:39:06 【问题描述】:

我正在尝试在 Java 中动态创建一个 XML 文件来显示时间表。我已经为我的 XML 文件创建了一个 DTD,并且我有一个想要用来转换 XML 的 XSL 文件。我不知道该怎么继续。

到目前为止,我尝试的是 onClick 某个按钮调用 Servlet,它会生成 XML 文件内容的字符串(将 XML 的动态部分插入字符串。我现在有一个包含内容的字符串XML 文件。我现在想使用我服务器上的 XSL 文件转换 XML 文件,并在调用 Servlet 的页面中显示结果(通过 AJAX 执行此操作)。

我不确定我是否在这个方向,也许我什至不应该从一开始就以字符串形式创建 XML 代码。所以我的问题是,我该如何从这里继续?如何使用 XSL 文件转换 XML 字符串,并将其作为对 AJAX 调用的响应发送,以便将生成的代码植入页面?或者,如果这不是这样做的方法,我如何以不同的方式创建动态 XML 文件以产生相同的结果?

【问题讨论】:

您想要创建 XML 的方法,还是创建 XSLT 的方法? 我不太确定...我有点迷茫,也许两者都有? 不,我将 XML 代码创建为字符串 您应该首先编辑您的帖子,以包含您生成的 XML 的代表性示例、XSL 样式表以及您希望从转换中获得的输出。哦,解释一下为什么您不想直接生成所需的输出并跳过中间 XML/XSLT。 我没有跳过中间部分的原因是因为我被要求为大学项目做这件事,而那部分是强制性的...... 【参考方案1】:

Apache XMLBeans 是一种很好的与 XML 进行序列化的解决方案。以下是您需要做的:

从http://www.apache.org/dyn/closer.cgi/xmlbeans/binaries 下载 XMLBeans 使用 XMLBeans inst2xsd 可执行文件(在 bin dir0 中将您的 DTD 转换为 XSD 使用 XMLBeans ANT 任务将 XSD 转换为可以在应用程序中使用的类

这是一个使用 XMLBeans 创建类的示例 ANT 脚本:

<project name="my_project" basedir="..">
<property name="my_project.project.path" value="$basedir"/>
<property name="xbean.dir" value="C:/lib/xmlbeans-2.2.0/lib" />
<path id="classpath">
    <fileset dir="$xbean.dir" includes="**/*.jar" />  
</path> 
<taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="classpath" />
<xmlbean schema="$testing_project.project.path/my.xsd" srcgendir="$my_project.project.path/src-tms-template-filter-fields" classgendir="$my_project.project.path/bin">
    <classpath><path refid="classpath" /></classpath>
</xmlbean>

您现在将拥有不错的 Java 类,您可以使用这些类来生成干净的代码,以便从存储在 DB 中的数据创建 XML。使用 BalusC 对 XSLT 的回答。

【讨论】:

【参考方案2】:

您可以为此使用JAXP。它是标准 Java SE API 的一部分。

StringReader xmlInput = new StringReader(xmlStringWhichYouHaveCreated);
InputStream xslInput = getServletContext().getResourceAsStream("file.xsl"); // Or wherever it is. As long as you've it as an InputStream, it's fine.

Source xmlSource = new StreamSource(xmlInput);
Source xslSource = new StreamSource(xslInput);
Result xmlResult = new StreamResult(response.getOutputStream()); // XML result will be written to HTTP response.

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.transform(xmlSource, xmlResult);

【讨论】:

【参考方案3】:

根据您的 XML 的复杂程度和大小,我会建议两种选择。对于小型、简单的结构,Java 的 DOM 实现 (Document) 就足够了。

如果您的 XML 更详细,我会查看 JAXB。这样做的好处是有一些工具可以从 XML 模式 (XSD) 自动创建 Java 类。因此,您必须首先将您的 DTD 转换为 XSD,但这应该不是问题。您最终会得到纯数据传输对象(具有相应 XML 元素值的 getter/setter 的纯对象),并且为您正确完成了解析/编码以及设置命名空间。这很方便,但对于简单的 XML 结构来说也有点过头了。

在这两种情况下,您最终都会得到一个 Document 实例,您最终可以使用 JAXP 对其进行转换。

【讨论】:

API 是什么意思?额外的图书馆?然后我有一个好消息,这些技术都内置了标准 JDK 的实现。

以上是关于Java 中的动态 XML 创建的主要内容,如果未能解决你的问题,请参考以下文章

根据 Java 中的值重新创建 XML

java窗体程序 打包jar后 怎么动态修改xml配置信息,请问哪位大神会啊

如何创建动态 JSF 表单域

SpringBoot整合MyBatisPlus配置动态数据源

Java50Mybatis:jdbc解耦,动态代理,日志

解析xml文件,如何动态的封装成一个java类