标准化XML阅读器方法

时间:2010-10-26 10:03:07

标签: java xml

在我维护的一个开源项目中,我们至少有三种不同的方式来读取,处理和编写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

2 个答案:

答案 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。等。