gpt4 book ai didi

java - 标准化 XML 阅读器方法

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:29 25 4
gpt4 key购买 nike

在我维护的一个开源项目中,我们至少有三种不同的方式来读取、处理和写入 XML 文件,我希望对单一方法进行标准化,以便于维护和稳定性。

目前,所有项目文件从配置到存储数据都使用 XML,我们希望在将来的某个时候迁移到简单的数据库,但仍然需要读取/写入某种形式的 XML 文件。

数据以 XML 格式存储,然后我们使用 XSLT 引擎 (Saxon) 将其转换为最终的 HTML 文件。

我们目前使用这些方法: - XMLEventReader/XMLOutputFactory (javax.xml.stream) - DocumentBuilderFactory (javax.xml.parsers) - JAXBContext (javax.xml.bind)

这些都有明显的优点和缺点吗?就我个人而言,我喜欢 DOM(文档生成器)的简单性,但如果它在性能或其他因素方面有意义,我愿意转换为其他之一。

编辑添加:项目运行时可能会读取/写入大量文件,大约有 100 到 10,000 个单独文件,每个文件大小约为 5Kb

最佳答案

这取决于您对数据的处理方式。

如果您只是对 XML 文件执行 XSLT 转换来生成 HTML 文件,那么您可能不需要直接接触解析器:

import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Demo {

public static void main(String[] args) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xsltTransform = new StreamSource(new File("xslt.xml"));
Transformer transformer = tf.newTransformer(xsltTransform);

StreamSource source = new StreamSource(new File("source.xml"));

StreamResult result = new StreamResult(new File("result.html"));
transformer.transform(source, result);
}

}

如果您需要在转换输入文档之前对其进行更改,DOM 是执行此操作的便捷机制:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;

public class Demo {

public static void main(String[] args) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xsltTransform = new StreamSource(new File("xslt.xml"));
Transformer transformer = tf.newTransformer(xsltTransform);

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("source.xml"));
// modify the document
DOMSource source = new DOMSource(document);

StreamResult result = new StreamResult(new File("result.html"));
transformer.transform(source, result);
}

}

如果您更喜欢使用类型化模型来更改数据,那么 JAXB 非常适合:

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.util.JAXBSource;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Demo {

public static void main(String[] args) throws Exception {
TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xsltTransform = new StreamSource(new File("xslt.xml"));
Transformer transformer = tf.newTransformer(xsltTransform);

JAXBContext jc = JAXBContext.newInstance("com.example.model");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Model model = (Model) unmarshaller.unmarshal(new File("source.xml"));
// modify the domain model
JAXBSource source = new JAXBSource(jc, model);

StreamResult result = new StreamResult(new File("result.html"));
transformer.transform(source, result);
}

}

关于java - 标准化 XML 阅读器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com