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

 更新时间:2018年07月18日 14:18:49   作者:浪丶荡  
今天小编就为大家分享一篇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

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

相关文章

  • 业务系统的Prometheus实践示例详解

    业务系统的Prometheus实践示例详解

    这篇文章主要为大家介绍了业务系统的Prometheus实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 从java中调用matlab详细介绍

    从java中调用matlab详细介绍

    这篇文章主要介绍了从java中调用matlab,有需要的朋友可以参考一下
    2013-12-12
  • Spring注解实现循环重试功能(适用场景分析)

    Spring注解实现循环重试功能(适用场景分析)

    这篇文章主要介绍了Spring注解实现循环重试功能,本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的,需要的朋友可以参考下
    2023-04-04
  • java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解

    这篇文章主要介绍了java 中基本算法之希尔排序的实例详解的相关资料,这里提供简单实现的实例,帮助大家学习理解此部分知识,需要的朋友可以参考下
    2017-07-07
  • java简单自定义异常实例代码

    java简单自定义异常实例代码

    这篇文章主要为大家详细介绍了java简单自定义异常实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 浅谈log4j的rootLogger及其他坑爹的地方

    浅谈log4j的rootLogger及其他坑爹的地方

    这篇文章主要介绍了log4j的rootLogger及其他坑爹的地方,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • IDEA远程部署调试Java应用程序的详细流程

    IDEA远程部署调试Java应用程序的详细流程

    这篇文章主要介绍了IDEA远程部署调试Java应用程序,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Mybatis Plus Wrapper查询某几列的方法实现

    Mybatis Plus Wrapper查询某几列的方法实现

    MybatisPlus中,使用Wrapper的select和notSelect方法可以精确控制查询的字段,本文就来介绍一下Mybatis Plus Wrapper查询某几列的方法实现,感兴趣的可以了解一下
    2024-10-10
  • java通过注解实现分表详解

    java通过注解实现分表详解

    这篇文章主要为大家详细介绍了java如何通过注解实现分表,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-11-11
  • Java Socket实现聊天室附1500行源代码

    Java Socket实现聊天室附1500行源代码

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。本篇文章手把手带你通过Java Socket来实现自己的聊天室,大家可以在过程中查缺补漏,温故而知新
    2021-10-10

最新评论