1. 程式人生 > >String與XML互轉以及從XML取節點值並修改

String與XML互轉以及從XML取節點值並修改

  • 讀取xml檔案生成Document物件
  • Document轉換成String型別串
  • String串轉成xml
  • 已知xml節點取節點值
  • 已知xml節點修改節點值

一個xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<transaction>
    <body>
        <request>
            <tranTyp>批量業務現存</tranTyp>
            <acctNm>0085213560</acctNm>
            <acctNo
>
6225885517843413</acctNo> <avlBal>201958.65</avlBal> <acctTyp>0</acctTyp> <tranTime>20170801101030</tranTime> <currencyTyp>CNY</currencyTyp> <tranDesc></tranDesc> <bal>
201958.65</bal> <tranAmt>100000.00</tranAmt> </request> </body> <header> <msg> <sndTm>101019</sndTm> <msgCd>WCS0000200</msgCd> <seqNb>632376531000009</seqNb> <sndMbrCd
>
5200</sndMbrCd> <rcvMbrCd>0000</rcvMbrCd> <sndDt>20170821</sndDt> <sndAppCd>CBS</sndAppCd> <rcvAppCd>WCS</rcvAppCd> <callTyp>SYN</callTyp> </msg> <ver>1.0</ver> <pnt> <sndTm>101216</sndTm> <sndMbrCd>0000</sndMbrCd> <rcvMbrCd>0000</rcvMbrCd> <sndDt>20170809</sndDt> <sndAppCd>ESB</sndAppCd> <rcvAppCd>WCS</rcvAppCd> </pnt> </header> </transaction>

java實現例項:

package com.adtec.mq.client;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;

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.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Test {

    /**
     * 
     * @param document
     *            Document物件(讀xml生成的)
     * @return String字串
     * @throws Throwable
     */
    public String xmlToString(Document document) throws Throwable {
        TransformerFactory ft = TransformerFactory.newInstance();
        Transformer ff = ft.newTransformer();
        ff.setOutputProperty("encoding", "GB2312");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ff.transform(new DOMSource(document), new StreamResult(bos));
        return bos.toString();
    }

    /**
     * 
     * @param xml形狀的str串
     * @return Document 物件
     */
    public Document StringTOXml(String str) {

        StringBuilder sXML = new StringBuilder();
        sXML.append(str);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        Document doc = null;
        try {
            InputStream is = new ByteArrayInputStream(sXML.toString().getBytes("utf-8"));
            doc = dbf.newDocumentBuilder().parse(is);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return doc;
    }

    /**
     * 
     * @param document
     * @return 某個節點的值 前提是需要知道xml格式,知道需要取的節點相對根節點所在位置
     */
    public String getNodeValue(Document document, String nodePaht) {
        XPathFactory xpfactory = XPathFactory.newInstance();
        XPath path = xpfactory.newXPath();
        String servInitrBrch = "";
        try {
            servInitrBrch = path.evaluate(nodePaht, document);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
        return servInitrBrch;
    }

    /**
     * 
     * @param document
     * @param nodePath
     *            需要修改的節點相對根節點所在位置
     * @param vodeValue
     *            替換的值
     */
    public void setNodeValue(Document document, String nodePath, String vodeValue) {
        XPathFactory xpfactory = XPathFactory.newInstance();
        XPath path = xpfactory.newXPath();
        Node node = null;
        ;
        try {
            node = (Node) path.evaluate(nodePath, document, XPathConstants.NODE);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
        node.setTextContent(vodeValue);
    }

    public static void main(String[] args) throws Throwable {
        // 讀取xml檔案,生成document物件
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // 檔案的位置在工作空間的根目錄(位置隨意,只要寫對就ok)
        Document document = builder.parse(new File("a.xml"));

        Test t = new Test();
        // XML————》String
        String str = t.xmlToString(document);
        System.out.println("str:" + str);
        // String ————》XML
        Document doc = t.StringTOXml(str);
        String nodePath = "/transaction/header/msg/sndMbrCd";
        // getNodeValue
        String nodeValue = t.getNodeValue(doc, nodePath);
        System.out.println("修改前nodeValue:" + nodeValue);
        // setNodeValue
        t.setNodeValue(doc, nodePath, nodeValue + "hello");
        System.out.println("修改後nodeValue:" + t.getNodeValue(doc, nodePath));
    }

}

測試結果:

str:<?xml version="1.0" encoding="UTF-8" standalone="no"?><transaction>
    <body>
        <request>
            <tranTyp>批量業務現存</tranTyp>
            <acctNm>0085213560</acctNm>
            <acctNo>6225885517843413</acctNo>
            <avlBal>201958.65</avlBal>
            <acctTyp>0</acctTyp>
            <tranTime>20170801101030</tranTime>
            <currencyTyp>CNY</currencyTyp>
            <tranDesc/>
            <bal>201958.65</bal>
            <tranAmt>100000.00</tranAmt>
        </request>
    </body>
    <header>
        <msg>
            <sndTm>101019</sndTm>
            <msgCd>WCS0000200</msgCd>
            <seqNb>632376531000009</seqNb>
            <sndMbrCd>5200</sndMbrCd>
            <rcvMbrCd>0000</rcvMbrCd>
            <sndDt>20170821</sndDt>
            <sndAppCd>CBS</sndAppCd>
            <rcvAppCd>WCS</rcvAppCd>
            <callTyp>SYN</callTyp>
        </msg>
        <ver>1.0</ver>
        <pnt>
            <sndTm>101216</sndTm>
            <sndMbrCd>0000</sndMbrCd>
            <rcvMbrCd>0000</rcvMbrCd>
            <sndDt>20170809</sndDt>
            <sndAppCd>ESB</sndAppCd>
            <rcvAppCd>WCS</rcvAppCd>
        </pnt>
    </header>
</transaction>
修改前nodeValue:5200
修改後nodeValue:5200hello