簡體   English   中英

等價於MS Access SQL中的“ For XML”

[英]Equivalent of “For XML” in MS Access SQL

我需要根據一些預定義的條件,從Java Access應用程序中使用JDBC和SQL語句從MS Access數據庫中選擇記錄到XML輸出。

有辦法實現嗎?

Access SQL沒有等效於T-SQL的FOR XML子句。 但是,您可以在項目中添加這樣的類

package com.example.ucanaccessdemo;

import java.io.StringWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class ResultSetToXml {
    // adapted from
    //   http://www.java2s.com/Code/Java/Database-SQL-JDBC/ConvertaResultSettoXML.htm

    public static String asXml(ResultSet rs) throws ParserConfigurationException, SQLException, TransformerException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();
        Element results = doc.createElement("Results");
        doc.appendChild(results);

        ResultSetMetaData rsmd = rs.getMetaData();
        int colCount = rsmd.getColumnCount();

        while (rs.next()) {
            Element row = doc.createElement("Row");
            results.appendChild(row);
            for (int i = 1; i <= colCount; i++) {
                String columnName = rsmd.getColumnName(i);
                Object value = rs.getObject(i);
                if (value != null) {
                    Element node = doc.createElement(columnName);
                    node.appendChild(doc.createTextNode(value.toString()));
                    row.appendChild(node);
                }
            }
        }
        DOMSource domSource = new DOMSource(doc);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        StringWriter sw = new StringWriter();
        StreamResult sr = new StreamResult(sw);
        transformer.transform(domSource, sr);

        return sw.toString();
    }
}

然后將您的ResultSet傳遞給asXml方法

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM Clients");
String xml = ResultSetToXml.asXml(rs);

對於這樣的示例表...

ID  LastName      FirstName  DOB
--  ------------  ---------  -------------------
 1  Thompson      Gord       2017-04-01 07:06:27
 2  Loblaw        Bob        1966-09-12 16:03:00
 3  Παπαδόπουλος  Ώπα

...生成的xml字符串將如下所示(為便於閱讀而格式化)

<Results>
    <Row>
        <ID>1</ID>
        <LastName>Thompson</LastName>
        <FirstName>Gord</FirstName>
        <DOB>2017-04-01 07:06:27.0</DOB>
    </Row>
    <Row>
        <ID>2</ID>
        <LastName>Loblaw</LastName>
        <FirstName>Bob</FirstName>
        <DOB>1966-09-12 16:03:00.0</DOB>
    </Row>
    <Row>
        <ID>3</ID>
        <LastName>Παπαδόπουλος</LastName>
        <FirstName>Ώπα</FirstName>
    </Row>
</Results>

暫無
暫無

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

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