String与XML互转以及从XML取节点值并修改的方法

时间:2021-05-20

读取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

以上这篇String与XML互转以及从XML取节点值并修改的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章