JAVA工具类总结——xml字符串与对象的转换

1. xml工具类代码

  先贴上工具类代码。如下:

package znxd.lxynzl.bank.base;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * xml解析工具类
 */
public class XmlUtils {
    /**
     * xml字符串转对象
     * @param clazz
     * @param xmlStr
     * @return
     */
    public static Object xmlStrToObject(Class clazz, String xmlStr) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            // 进行将Xml转成对象的核心接口
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sr = new StringReader(xmlStr);
            xmlObject = unmarshaller.unmarshal(sr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }

    /**
     * 对象转xml字符串
     * @param obj
     * @param load
     * @return
     * @throws JAXBException
     */
    public static String objectToXmlStr(Object obj,Class<?> load){
        String result = "";
        try{
            JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj,writer);
            result = writer.toString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
}

2. 使用方法

2.1 xml报文示例

  首先,要有个xml报文,我找了个复杂点的,如下:

	<?xml version="1.0" encoding="GB2312"?>
	<bocb2e version="100" security="true" lang="chs">
	<head>
	<termid>E127000000001</termid>
	<trnid>20060704001</trnid>
	<custid>12345678</custid>
	<cusopr>BOC</cusopr>
	<trncod>b2e0001</trncod>
	</head>
	<trans>
	<trn-b2e0001-rq>
	<b2e0001-rq>
	<custdt>20060704091000</custdt>
	<oprpwd>88888888</oprpwd>
	<ceitinfo>MIIE9AYJKoZIhvcNA……</ceitinfo>
	</b2e0001-rq>
	</trn-b2e0001-rq>
	</trans>
	</bocb2e>

  大体可以看出来,首先最外边是根标签<bocb2e> ,下一级是<head><trans>,然后再往里一层层的。

2.2 对象xml注解的添加

  既然要xml与对象转换,那自然要先创建对象,因为按照上边的报文来看,每一层即一个对象,这样的话就会有好几个对象。
  虽然多,但是并不复杂,只需要把xml标签对应上即可,另外该工具不需要额外引入依赖,属于java自己的工具。

主要就三个注解,我理解的意思如下:
  @XmlRootElement表示当前标签的名字
  @XmlType表示当前对象里,含有的下级标签对应的对象的属性名。
  @XmlElement表示当前对象的属性,对应到xml里的标签名。

需要创建的对象具体如下:

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"head","trans"})
@XmlRootElement(name="bocb2e")
public class BOCSignRequestXml {

    private SignRequestHead head;
    
    private SignRequestTrans trans;
   //省略get set方法
}

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 签名请求head体
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="head")
public class SignRequestHead {

    @XmlElement(name="termid")
    private String termid;

    @XmlElement(name="trnid")
    private String trnid;

    @XmlElement(name="custid")
    private String custid;

    @XmlElement(name="cusopr")
    private String cusopr = "BOC";

    @XmlElement(name="trncod")
    private String trncod = "b2e0001";
    //省略get set方法
}

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"trnB2e0001Rq"})
@XmlRootElement(name="trans")
public class SignRequestTrans {

    @XmlElement(name="trn-b2e0001-rq")
    private TrnB2e0001Rq trnB2e0001Rq;

   //省略get set方法
}


import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"b2e0001Rq"})
@XmlRootElement(name="trn-b2e0001-rq")
public class TrnB2e0001Rq {

    @XmlElement(name="b2e0001-rq")
    private B2e0001Rq b2e0001Rq;

    //省略get set方法
}


import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="b2e0001-rq")
public class B2e0001Rq {

    @XmlElement(name="custdt")
    private String custdt;

    @XmlElement(name="oprpwd")
    private String oprpwd;

    @XmlElement(name="ceitinfo")
    private String ceitinfo;

    //省略get set方法
}

2.3 xml转对象的示例

  xml字符串转对象的测试方法如下:

 public static void main(String[] args){
        //签到
        String xmlStr ="<?xml version=\"1.0\" encoding=\"GB2312\"?>" +
                "<bocb2e version=\"100\" security=\"true\" lang=\"chs\">" +
                "<head>" +
                "<termid>E127000000001</termid>" +
                "<trnid>20060704001</trnid>" +
                "<custid>12345678</custid>" +
                "<cusopr>BOC</cusopr>" +
                "<trncod>b2e0001</trncod>" +
                "</head>" +
                "<trans>" +
                "<trn-b2e0001-rq>" +
                "<b2e0001-rq>" +
                "<custdt>20060704091000</custdt>" +
                "<oprpwd>88888888</oprpwd>" +
                "<ceitinfo>MIIE9AYJKoZIhvcNA……</ceitinfo>" +
                "</b2e0001-rq>" +
                "</trn-b2e0001-rq>" +
                "</trans>" +
                "</bocb2e>";

        BOCSignRequestXml requestXml = (BOCSignRequestXml) XmlUtils.xmlStrToObject(BOCSignRequestXml.class,xmlStr);
        System.out.println(requestXml.getTrans().getTrnB2e0001Rq()
        .getB2e0001Rq().getOprpwd());
        System.out.println(requestXml.getHead().getTrncod());
        

  执行后的结果如下:

	88888888
	b2e0001

2.4 对象转xml的示例

  对象转xml字符串的测试方法如下:

    public static void main(String[] args){
        BOCSignRequestXml requestXml1 = new BOCSignRequestXml();
        SignRequestHead requestHead = new SignRequestHead();
        requestHead.setCusopr("2222");
        requestXml1.setHead(requestHead);
        String xmlStrTo =  XmlUtils.objectToXmlStr(requestXml1,BOCSignRequestXml.class);
        System.out.println(xmlStrTo);
    }

  执行后的结果如下:

	<?xml version="1.0" encoding="GBK" standalone="yes"?>
	<bocb2e>
	    <head>
	        <cusopr>2222</cusopr>
	        <trncod>b2e0001</trncod>
	    </head>
	</bocb2e>

  以上即是xml字符串与对象之间的转换方法。亲测,灰常好用。

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: Java字符串编码转换工具类可以通过使用Java自带的Charset类和String类的getBytes()方法来实现。下面是一个示例的工具类: ```java import java.nio.charset.Charset; public class EncodingUtils { // 将指定编码的字符串转换为默认编码的字符串 public static String convertToDefaultEncoding(String str, String sourceEncoding) { byte[] bytes = str.getBytes(Charset.forName(sourceEncoding)); return new String(bytes); } // 将默认编码的字符串转换为指定编码的字符串 public static String convertToEncoding(String str, String targetEncoding) { byte[] bytes = str.getBytes(); return new String(bytes, Charset.forName(targetEncoding)); } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { String str1 = "中文字符串"; // 将UTF-8编码的字符串转换为默认编码的字符串 String defaultEncodingStr = EncodingUtils.convertToDefaultEncoding(str1, "UTF-8"); System.out.println("Default Encoding: " + defaultEncodingStr); // 将默认编码的字符串转换为GBK编码的字符串 String targetEncodingStr = EncodingUtils.convertToEncoding(defaultEncodingStr, "GBK"); System.out.println("Target Encoding: " + targetEncodingStr); } } ``` 在上述示例中,工具类`EncodingUtils`提供了两个静态方法。`convertToDefaultEncoding()`方法将指定编码的字符串转换为默认编码的字符串,而`convertToEncoding()`方法将默认编码的字符串转换为指定编码的字符串。 ### 回答2: Java字符串编码转换工具类是一种用于处理字符串编码转换工具类,它可以将字符串从一种字符编码转换为另一种字符编码。在Java中,字符串的编码可以使用标准的UTF-8、UTF-16、ISO-8859-1等编码方式。 这个工具类通常提供以下几种方法: 1. `toUTF8(String str)`:将字符串从其他编码转换为UTF-8编码。 2. `fromUTF8(String str)`:将UTF-8编码的字符串转换为其他编码。 3. `toISO88591(String str)`:将字符串从其他编码转换为ISO-8859-1编码。 4. `fromISO88591(String str)`:将ISO-8859-1编码的字符串转换为其他编码。 使用这个工具类可以避免在转换编码时出现乱码或者字符串不可识别的问题。例如,当我们从外部资源读取数据时,如果字符串的编码与程序默认字符编码不一致,就会导致乱码,这时可以使用这个工具类进行编码转换。 在实现这个工具类时,可以使用Java提供的相关类库,如`java.nio.charset.Charset`、`java.nio.CharBuffer`等类来进行编码转换操作。首先,通过指定源编码和目标编码,创建`Charset`对象;然后,使用`encode`方法将源字符串编码成字节序列,并使用目标`Charset`对象的`decode`方法将字节序列解码成目标编码的字符串。 使用这个工具类时,需要注意的是源编码和目标编码必须是支持的字符编码,否则会抛出编码不支持的异常。此外,还应该注意对输入的异常情况进行处理,例如空字符串或空指针异常,以确保程序的健壮性。 总之,Java字符串编码转换工具类是一个方便实用的工具,可以帮助我们在不同编码间进行转换,避免乱码的问题,提高程序的稳定性和可靠性。 ### 回答3: Java提供了许多内置的工具类来方便字符串编码转换。其中最常用的工具类是`java.nio.charset.Charset`和`java.lang.String`类。 首先,`Charset`类包含了许多常见的字符集,比如UTF-8、GBK、ISO-8859-1等。我们可以使用`Charset.forName(String charsetName)`方法来获取指定字符集的一个实例。 接下来,`String`类提供了几个方法来进行字符串编码转换。其中最常用的是`getBytes(String charsetName)`方法,它将字符串按照指定的字符集转换为字节数组。例如,如果我们想将字符串转换为UTF-8编码的字节数组,可以使用`getBytes("UTF-8")`方法。 除了将字符串转换为字节数组,`String`类还提供了`getBytes()`方法,它将字符串按照默认的字符集转换为字节数组。默认的字符集可以通过调用`Charset.defaultCharset()`方法获取。 另外,如果我们想将字节数组转换字符串,可以使用`String`类的构造方法`String(byte[] bytes, Charset charset)`。该构造方法将字节数组按照指定的字符集转换字符串。 除了上述的方法,还有一些其他的工具类可以辅助字符串编码转换。比如,`java.io.InputStreamReader`和`java.io.OutputStreamWriter`类提供了将字节流与字符流进行转换的功能。 总结来说,Java提供了丰富的工具类来进行字符串编码转换。我们可以通过`Charset`类获取指定字符集的实例,通过`String`类的相关方法来进行字符串与字节数组之间的转换。另外,还可以使用`java.io.InputStreamReader`和`java.io.OutputStreamWriter`类进行字节流与字符流之间的转换。这些工具类的使用可以方便地实现字符串编码转换的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁壮成长的凌大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值