簡體   English   中英

標准化XML閱讀器方法

[英]Standardise on a XML reader methodology

在我維護的一個開源項目中,我們至少有三種不同的讀取,處理和寫入XML文件的方式,並且我希望對一種方法進行標准化以簡化維護和穩定性。

當前,所有項目文件都使用XML,從配置到存儲的數據,我們希望在將來的某個時候遷移到簡單的數據庫,但仍需要讀取/寫入某種形式的XML文件。

數據以XML格式存儲,然后我們使用XSLT引擎(Saxon)轉換為最終的HTML文件。

當前,我們使用以下方法:-XMLEventReader / XMLOutputFactory(javax.xml.stream)-DocumentBuilderFactory(javax.xml.parsers)-JAXBContext(javax.xml.bind)

每個方面都有明顯的利弊嗎? 就個人而言,我喜歡DOM(文檔生成器)的簡單性,但是如果在性能或其他因素方面有意義,我願意轉換為另一種。

編輯添加:在項目運行時,可能會讀取/寫入大量文件,每個文件大約5Kb介於100到10,000個之間

這取決於您對數據的處理方式。

如果僅在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(總是)足夠小以可以加載到內存中,那么您不必擔心內存占用問題。 您可以使用DOM解析器。 如果您需要通過150 MB的XML進行解析,則可能需要考慮使用SAX。 等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM