Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML读取器方法的标准化_Java_Xml - Fatal编程技术网

Java XML读取器方法的标准化

Java XML读取器方法的标准化,java,xml,Java,Xml,在我维护的一个开源项目中,我们至少有三种不同的方式来读取、处理和编写XML文件,我想在一种方法上实现标准化,以便于维护和稳定 目前所有的项目文件从配置到存储数据都使用XML,我们希望在将来的某个时候迁移到一个简单的数据库,但仍然需要读/写某种形式的XML文件 数据以XML格式存储,然后我们使用XSLT引擎(Saxon)将其转换为最终的HTML文件 我们目前使用这些方法: -XMLEventReader/XMLOutputFactory(javax.xml.stream) -DocumentBui

在我维护的一个开源项目中,我们至少有三种不同的方式来读取、处理和编写XML文件,我想在一种方法上实现标准化,以便于维护和稳定

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

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

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

这些都有明显的优点和缺点吗? 就个人而言,我喜欢DOM(Document Builder)的简单性,但如果它在性能或其他因素方面有意义的话,我愿意转换为其他类型

编辑以添加:
当项目运行时,可能会有大量的文件被读取/写入,每个文件大小约为5Kb,在100到10000个之间

这是一个非常主观的话题。这主要取决于如何使用xml和xml的大小。如果XML(总是)足够小,可以加载到内存中,那么就不必担心内存足迹。您可以使用DOM解析器。如果需要通过150MB的xml进行解析,您可能需要考虑使用SAX。等等。

这是一个非常主观的话题。这主要取决于如何使用xml和xml的大小。如果XML(总是)足够小,可以加载到内存中,那么就不必担心内存足迹。您可以使用DOM解析器。如果需要通过150MB的xml进行解析,您可能需要考虑使用SAX。等等。

这取决于您对数据所做的操作

如果只是对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);            
    }

}

这取决于您对数据所做的操作

如果只是对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);            
    }

}

不,XML文件很多,但不是特别大。我的猜测是,对于小型xml文件,性能差异应该不会太大。虽然说“小”是指小到什么程度会产生不同。不,XML文件很多,但不是特别大。我的猜测是,对于小型xml文件,性能差异应该不会太大。话虽如此,“小”是指小到什么程度会产生不同。在将XML中的数据写回XML之前,我们可能需要对其进行一些处理,包括索引和排序。目前,我们编写的XML数据没有任何DTD或XSD,但对我来说,编写和维护这将是相当简单的,然而,我只希望这样做,如果它能带来明显的好处,而不仅仅是另一种“文档开销”。为什么您觉得需要XML模式?对于JAXB,您可以从POJO开始并对其进行注释。也许我误解了您文章中的“如果您喜欢类型化模型”和“JAXBContext.newInstance(“com.example.model”);”部分。看起来我还有更多的调查要做。类型化模型指的是将XML表示为域对象。根据您的问题,您已经在为此使用JAXB。使用JAXB,您可以从XML模式生成类,或者从Java类开始,使用注释将它们映射到XML。这里可以找到一个例子:我们可能需要在将XML中的数据写回XML之前对其进行一些处理,包括索引和排序。目前,我们编写的XML数据没有任何DTD或XSD,但对我来说,编写和维护这将是相当简单的,然而,我只希望这样做,如果它能带来明显的好处,而不仅仅是另一种“文档开销”。为什么您觉得需要XML模式?对于JAXB,您可以从POJO开始并对其进行注释。也许我误解了您文章中的“如果您喜欢类型化模型”和“JAXBContext.newInstance(“com.example.model”);”部分。看起来我还有更多的调查要做。类型化模型指的是将XML表示为域对象。根据您的问题,您已经在为此使用JAXB。使用JAXB,您可以从XML模式生成类,或者从Java类开始,使用注释将它们映射到XML。可以在此处找到一个示例: