在我维护的一个开源项目中,我们至少有三种不同的方式来读取,处理和编写XML文件,我希望标准化一种方法,以便于维护和稳定。
目前,所有项目文件都使用从配置到存储数据的XML,我们希望将来某个时候迁移到一个简单的数据库,但仍然需要读/写某种形式的XML文件。 / p>
数据以XML格式存储,然后我们使用XSLT引擎(Saxon)转换为最终的HTML文件。
我们目前使用这些方法: - XMLEventReader / XMLOutputFactory(javax.xml.stream) - DocumentBuilderFactory(javax.xml.parsers) - JAXBContext(javax.xml.bind)
这些都有明显的利弊吗? 就个人而言,我喜欢DOM(文档生成器)的简单性,但如果它在性能或其他因素方面有意义,我愿意转换为其他的一个。
编辑添加: 项目运行时可以读取/写入大量文件,介于100和100之间。 10,000个单独的文件,每个约5Kb
答案 0 :(得分:1)
这取决于您对数据的处理方式。
如果您只是对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);
}
}
答案 1 :(得分:0)
这是一个非常主观的话题。它主要取决于您将如何使用XML的XML和大小。如果XML(总是)足够小以便加载到内存中,那么您不必担心内存占用。您可以使用DOM解析器。如果你需要解析150 MB xml,你可能会想到使用SAX。等。