XML格式文件转为JSON文件

在日常工作中,可能会遇到需要将xml格式转化为json格式的情况,下面为我自己写的小例子。希望可以给大家一些帮助。

一、代码部分

package com.neusoft.jiangsupatch.bo;

import java.io.File;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * XML转JSONObject实现
 * @author 
 *
 */
public class TestXmlToJson {
	/**
	 * 将element转成JSONObject
	 * 属性与子节点为最小单元不再进行递归
	 * @param node
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static JSONObject elementToJSONObject(Element node) {
		JSONObject result = new JSONObject();
		// 当前节点的名称、文本内容和属性(属性变为子标签)
		List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
		for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
			result.put(attr.getName(), attr.getValue());
		}
		// 递归遍历当前节点所有的子节点
		List<Element> listElement = node.elements();// 所有一级子节点的list
		if (!listElement.isEmpty()) {
			for (Element e : listElement) {// 遍历所有一级子节点
				if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
					result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待(直接转化为子标签)
				else {
					// 若存在子节点或者属性不为空,要继续向下一级转化;当下一级存在相同标签时,转为数组;下一级不存在相同标签,仍为json对象
					if (!hasCF(e.elements())) {
						result.put(e.getName(), elementToJSONObject(e));
					} else {
						result.put(e.getName(), elementToJSONArray(e));
					}

				}
			}
		}

		return result;
	}

	/**
	 * 将element转成JSONArray
	 * 
	 * @param node
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static JSONArray elementToJSONArray(Element node) {
		JSONArray result = new JSONArray();
		List<Element> listElement = node.elements();// 所有一级子节点的list
		if (!listElement.isEmpty()) {
			for (Element e : listElement) {// 遍历所有一级子节点
				JSONObject json = new JSONObject();
				json.put(e.getName(), elementToJSONObject(e));
				result.add(json);
			}
		}

		return result;
	}

	/**
	 * 读取文本XMl字符串获取Document对象
	 * 
	 * @param File
	 *            (文本路径)(如:"D:\\a.xml")
	 * @return
	 * @throws Exception
	 */
	public static Document getDocumentByReadText(String File) throws Exception {
		try {
			SAXReader sax = new SAXReader();// 创建一个SAXReader对象
			sax.setEncoding("UTF-8");
			File xmlFile = new File(File);// 根据指定的路径创建file对象
			Document document = sax.read(xmlFile);// 获取document对象,如果文档无节点,则会抛出Exception提前结束
			return document;
		} catch (Exception e) {
			SAXReader sax = new SAXReader();// 创建一个SAXReader对象
			sax.setEncoding("GBK");
			File xmlFile = new File(File);// 根据指定的路径创建file对象
			Document document = sax.read(xmlFile);// 获取document对象,如果文档无节点,则会抛出Exception提前结束
			return document;
		}
	}

	/**
	 * 判断list中是否存在相同的element
	 * @param elements
	 * @return
	 */
	public static boolean hasCF(List<Element> elements) {
		Boolean flag = false;
		for (int i = 0; i < elements.size() - 1; i++) {
			if (elements.get(i).getName().equals(elements.get(i + 1).getName())) {
				flag = true;
			}
		}
		return flag;
	}

	/**
	 * 测试方法
	 * @param args
	 */
	public static void main(String[] args) {
		String json = "";

		try {

			json = elementToJSONObject(
					getDocumentByReadText(
							"C:\\Users\\Administrator\\Desktop\\1.xml")
							.getRootElement()).toString();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("转换json失败");
		}
		System.out.println(json);
	}
}

二、原xml格式如下:

<?xml version="1.0" encoding="GBK"?>
<package>
    <grphdr>
        <appseriono>32040001013202002018110510518</appseriono>
        <cfbz>1</cfbz>
        <aaz400>3202990101</aaz400>
        <sendcode>3204000101</sendcode>
        <receivecode>TAX</receivecode>
        <senddate>20181105</senddate>
        <sendtime>20181105171132</sendtime>
        <typecode>CBXX005</typecode>
        <typename/>
        <ptszqh>320200</ptszqh>
        <sign/>
        <dgst/>
        <bodyisfile>0</bodyisfile>
        <filename/>
        <filepath/>
        <appmentno/>
        <appcount>0</appcount>
        <appcode/>
        <exceptionmessage/>
    </grphdr>
    <busitext>
        <record>
            <jcxx>
                <xh>1000000000030419</xh>
                <aaz400>228083803</aaz400>
                <sbuuid>120100</sbuuid>
                <aab001>10176248</aab001>
                <aaa027>1</aaa027>
                <aae140>41</aae140>
                <aaa067>1</aaa067>
                <aaa042>2</aaa042>
                <aae041>201801</aae041>
                <aae042>201812</aae042>
                <hxbz>N</hxbz>
                <aab099>1</aab099>
                <aae036>20181031163227</aae036>
                <aaa321>1</aaa321>
                <aaa322>11</aaa322>
                <aae418>20181031153205</aae418>
            </jcxx>
            <jcxx>
                <xh>1000000000030421</xh>
                <aaz400>228083813</aaz400>
                <sbuuid>120100</sbuuid>
                <aab001>10176248</aab001>
                <aaa027>1</aaa027>
                <aae140>41</aae140>
                <aaa067>1</aaa067>
                <aaa042>2</aaa042>
                <aae041>201801</aae041>
                <aae042>201812</aae042>
                <hxbz>N</hxbz>
                <aab099>1</aab099>
                <aae036>20181031163227</aae036>
                <aaa321>1</aaa321>
                <aaa322>11</aaa322>
                <aae418>20181031153205</aae418>
            </jcxx>
        </record>
    </busitext>
</package>

三、生成对应的json字符串如下:

{
    "grphdr": {
        "appseriono": "32040001013202002018110510518",
        "cfbz": "1",
        "aaz400": "3202990101",
        "sendcode": "3204000101",
        "receivecode": "TAX",
        "senddate": "20181105",
        "sendtime": "20181105171132",
        "typecode": "CBXX005",
        "typename": "",
        "ptszqh": "320200",
        "sign": "",
        "dgst": "",
        "bodyisfile": "0",
        "filename": "",
        "filepath": "",
        "appmentno": "",
        "appcount": "0",
        "appcode": "",
        "exceptionmessage": ""
    },
    "busitext": {
        "record": [
            {
                "jcxx": {
                    "xh": "1000000000030419",
                    "aaz400": "228083803",
                    "sbuuid": "120100",
                    "aab001": "10176248",
                    "aaa027": "1",
                    "aae140": "41",
                    "aaa067": "1",
                    "aaa042": "2",
                    "aae041": "201801",
                    "aae042": "201812",
                    "hxbz": "N",
                    "aab099": "1",
                    "aae036": "20181031163227",
                    "aaa321": "1",
                    "aaa322": "11",
                    "aae418": "20181031153205"
                }
            },
            {
                "jcxx": {
                    "xh": "1000000000030421",
                    "aaz400": "228083813",
                    "sbuuid": "120100",
                    "aab001": "10176248",
                    "aaa027": "1",
                    "aae140": "41",
                    "aaa067": "1",
                    "aaa042": "2",
                    "aae041": "201801",
                    "aae042": "201812",
                    "hxbz": "N",
                    "aab099": "1",
                    "aae036": "20181031163227",
                    "aaa321": "1",
                    "aaa322": "11",
                    "aae418": "20181031153205"
                }
            }
        ]
    }
}

喜欢我的文章希望和我一起成长的宝宝们,可以搜索并添加公众号TryTestwonderful ,或者扫描下方二维码添加公众号

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TryTestwonderful

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

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

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

打赏作者

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

抵扣说明:

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

余额充值