不得不看的XML解析与生成案例

问:每个月2000工资,怎样才能在厦门买一套100平的房子和一辆奥迪A6
答:先给自己定个小目标,比如说先活他个250年,然后向天再借500年

言归正传

读取XML(一)

创建一个school.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<sync>
	<fields_ref>  	
		<!--学生指标对应: corr_befor(对应前指标) corr_befor(对应后指标) desc(指标描述)-->
		<info table="students">    
			<field_ref corr_befor="stu_id"		corr_after="stuId"		desc="学号"></field_ref>
			<field_ref corr_befor="stu_name"	corr_after="stuName"	desc="学生姓名"></field_ref>
			<field_ref corr_befor="stu_age"		corr_after="stuAge"		desc="学生年龄"></field_ref>
			<field_ref corr_befor="stu_sex"		corr_after="stuSex"		desc="学生性别" ></field_ref>
			<field_ref corr_befor="stu_gra"		corr_after="stuGra"		desc="所在班级" ></field_ref>
		</info>
		<info table="teachers">  
			<field_ref corr_befor="tea_id"		corr_after="teaId"		desc="教师编号"></field_ref>
			<field_ref corr_befor="tea_name"	corr_after="teaName"	desc="教师姓名"></field_ref>
			<field_ref corr_befor="tea_age"		corr_after="teaAge"		desc="教学年数"></field_ref>
			<field_ref corr_befor="tea_subject"	corr_after="teaSubject"	desc="教学科目"></field_ref>
		</info>
		<info table="grades">
			<field_ref corr_befor="gra_name"	corr_after="graName"	desc="教室名字"></field_ref>
			<field_ref corr_befor="gra_num"		corr_after="graNum"		desc="学生数量"></field_ref>
			<field_ref corr_befor="gra_addrs"	corr_after="graAddrs"	desc="教室位置"></field_ref>
		</info>
		<info table="score">
			<field_ref corr_befor="stu_id"		corr_after="stuId"		desc="学生学号"></field_ref>
			<field_ref corr_befor="sco_result"	corr_after="scoResult"	desc="学生成绩"></field_ref>
		</info>
	</fields_ref>
</sync>

导入相应的包

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

读取xml文件

public class ReadXML {

   private List checkXml() throws Exception {
       //xml文件存放地址
       String xmlPath = "C:\\tomcat-in\\idea2019.3\\Tomcat-7.0.41-v76\\config" + File.separator + "school.xml";
       Document doc = null;
       String table = "";
       List infoList = new ArrayList();
       File file = new File(xmlPath);
       if (!file.exists()) {
           return infoList;
       }
       try {
           SAXBuilder saxbuilder = new SAXBuilder();
           doc = saxbuilder.build(file);
           XPath xPath = XPath.newInstance("/sync/fields_ref");
           Element infoElement = (Element) xPath.selectSingleNode(doc);
           List<Element> info = infoElement.getChildren("info");
           for (Element el : info) {
               Map<String, String> resutlMap = null;
               table = el.getAttributeValue("table");
               List fieldList = el.getChildren(); //获取 field_ref
               for (int i = 0; i < fieldList.size(); i++) {
                   resutlMap = new HashMap<String, String>();
                   Element element = (Element) fieldList.get(i);
                   String corr_befor = element.getAttributeValue("corr_befor");
                   String corr_after = element.getAttributeValue("corr_after");
                   String desc = element.getAttributeValue("desc");
                   resutlMap.put("corr_befor", corr_befor);
                   resutlMap.put("corr_after", corr_after);
                   resutlMap.put("table", table);
                   resutlMap.put("desc", desc);
                   infoList.add(resutlMap);
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
           throw e;
       }
       return infoList;
   }

   public static void main(String[] args) {
       ReadXML readXML = new ReadXML();
       try {
           List resultList = readXML.checkXml();
           System.out.println(resultList);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

输出结果

[

   {
       corr_befor = stu_id, corr_after = stuId, table = students, desc = 学号
   },

   {
       corr_befor = stu_name, corr_after = stuName, table = students, desc = 学生姓名
   },

   {
       corr_befor = stu_age, corr_after = stuAge, table = students, desc = 学生年龄
   },

   {
       corr_befor = stu_sex, corr_after = stuSex, table = students, desc = 学生性别
   },

   {
       corr_befor = stu_gra, corr_after = stuGra, table = students, desc = 所在班级
   },

   {
       corr_befor = tea_id, corr_after = teaId, table = teachers, desc = 教师编号
   },

   {
       corr_befor = tea_name, corr_after = teaName, table = teachers, desc = 教师姓名
   },

   {
       corr_befor = tea_age, corr_after = teaAge, table = teachers, desc = 教学年数
   },

   {
       corr_befor = tea_subject, corr_after = teaSubject, table = teachers, desc = 教学科目
   },

   {
       corr_befor = gra_name, corr_after = graName, table = grades, desc = 教室名字
   },

   {
       corr_befor = gra_num, corr_after = graNum, table = grades, desc = 学生数量
   },

   {
       corr_befor = gra_addrs, corr_after = graAddrs, table = grades, desc = 教室位置
   },

   {
       corr_befor = stu_id, corr_after = stuId, table = score, desc = 学生学号
   },

   {
       corr_befor = sco_result, corr_after = scoResult, table = score, desc = 学生成绩
   }
]

读取XML(二)

xml字符串样例

<?xml version="1.0" encoding=GBK?>
<Message type="response" version="1.0">
    <Head>
        <Account>zs</Account>
        <PassWord>123456</PassWord>
    </Head>
    <Body>
        <UserInfo>
            <UserName>张三</UserName>
            <Age>23</Age>
            <CardID>320481198204092420</CardID>
            <deptId>01010301</deptId>
        </UserInfo>
        <UserLimited>
            <UserLimitedVo>
                <Code>01</Code>
                <Desc>权限1</Desc>
            </UserLimitedVo>
            <UserLimitedVo>
                <Code>02</Code>
                <Desc>权限2</Desc>
            </UserLimitedVo>
            <UserLimitedVo>
                <Code>03</Code>
                <Desc>权限3</Desc>
            </UserLimitedVo>
        </UserLimited>
    </Body>
</Message>

导入相应包

import net.sf.json.JSONObject;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import org.xml.sax.InputSource;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

读取xml字符串方法

public static void parseXML() {
        String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
                "<Message type=\"response\" version=\"1.0\">\n" +
                "    <Head>\n" +
                "        <Account>zs</Account>\n" +
                "        <PassWord>123456</PassWord>\n" +
                "    </Head>\n" +
                "    <Body>\n" +
                "        <UserInfo>\n" +
                "            <UserName>张三</UserName>\n" +
                "            <Age>23</Age>\n" +
                "            <CardID>320481198204092420</CardID>\n" +
                "            <deptId>01010301</deptId>\n" +
                "        </UserInfo>\n" +
                "        <UserLimited>\n" +
                "            <UserLimitedVo>\n" +
                "                <Code>01</Code>\n" +
                "                <Desc>权限1</Desc>\n" +
                "            </UserLimitedVo>\n" +
                "            <UserLimitedVo>\n" +
                "                <Code>02</Code>\n" +
                "                <Desc>权限2</Desc>\n" +
                "            </UserLimitedVo>\n" +
                "            <UserLimitedVo>\n" +
                "                <Code>03</Code>\n" +
                "                <Desc>权限3</Desc>\n" +
                "            </UserLimitedVo>\n" +
                "        </UserLimited>\n" +
                "    </Body>\n" +
                "</Message>\n";
        try {
            StringReader reader = new StringReader(xml);
            InputSource source = new InputSource(reader);
            SAXBuilder saxbuilder = new SAXBuilder();
            Document document = saxbuilder.build(source);

            //获取Message节点属性
            String path = "/Message";
            XPath xPath = XPath.newInstance(path);
            List paramslist = xPath.selectNodes(document);
            Element element = (Element) paramslist.get(0);
            String type = element.getAttributeValue("type");
            String version = element.getAttributeValue("version");
            JSONObject json = new JSONObject();
            json.put("type", type);
            json.put("version", version);
            System.out.println("获取Message节点属性:" + json);

            //获取具体Account节点值
            path = "/Message/Head/Account";
            xPath = XPath.newInstance(path);
            paramslist = xPath.selectNodes(document);
            element = (Element) paramslist.get(0);
            String value = element.getText();
            json.clear();
            json.put("Account", value);
            System.out.println("获取具体Account节点值:" + json);
            //获取具体PassWord节点值
            path = "/Message/Head/PassWord";
            xPath = XPath.newInstance(path);
            paramslist = xPath.selectNodes(document);
            element = (Element) paramslist.get(0);
            value = element.getText();
            json.clear();
            json.put("Account", value);
            System.out.println("获取具体PassWord节点值:" + json);

            //获取UserInfo节点下所有子节点值
            path = "/Message/Body/UserInfo";
            xPath = XPath.newInstance(path);
            paramslist = xPath.selectNodes(document);
            element = (Element) paramslist.get(0);
            List children = element.getChildren();
            json.clear();
            for (int i = 0; i < children.size(); i++) {
                String keyName = ((Element) children.get(i)).getName();//子节点
                String keyValue = ((Element) children.get(i)).getText();//子节点值
                json.put(keyName, keyValue);
            }
            System.out.println("获取UserInfo节点下所有子节点值:" + json);

            //获取UserLimitedVo节点下的所有Code值,组成集合
            path = "/Message/Body/UserLimited/UserLimitedVo";
            xPath = XPath.newInstance(path);
            paramslist = xPath.selectNodes(document);
            Iterator it = paramslist.iterator();
            List list = new ArrayList();
            json.clear();
            while (it.hasNext()) {
                element = (Element) it.next();
                list.add(element.getChildText("Code"));
            }
            json.put("Code", list);
            System.out.println("获取UserLimitedVo节点下的所有Code值,组成集合:" + json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

main()方法调用

public static void main(String[] args) {
        parseXML();
    }

输出

获取Message节点属性:{"type":"response","version":"1.0"}
获取具体Account节点值:{"Account":"zs"}
获取具体PassWord节点值:{"Account":"123456"}
获取UserInfo节点下所有子节点值:{"UserName":"张三","deptId":"01010301","CardID":"320481198204092420","Age":"23"}
获取UserLimitedVo节点下的所有Code值,组成集合:{"Code":["01","02","03"]}

读取XML(三)

xml字符串样例

<cas:serviceResponse
    xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>ADMIN</cas:user>
    </cas:authenticationSuccess>
</cas:serviceResponse>

导入相应包

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.compile;

解析xml方法

public static void parseXML() {
        String xml = "<cas:serviceResponse\n" +
                "    xmlns:cas='http://www.yale.edu/tp/cas'>\n" +
                "    <cas:authenticationSuccess>\n" +
                "        <cas:user>ADMIN</cas:user>\n" +
                "    </cas:authenticationSuccess>\n" +
                "</cas:serviceResponse>";

        String returnValue = "";
        Pattern p = compile("\\s*|\t|\r|\n");
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder
                    .parse(new InputSource(new StringReader(xml)));
            Element root = doc.getDocumentElement();
            String xmlns = root.getAttribute("xmlns:cas");
            System.out.println("xmlns:cas=" + xmlns);
            NodeList nodeList = root
                    .getElementsByTagName("cas:authenticationSuccess");
            if (nodeList != null) {
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Node _book = nodeList.item(i);
                    returnValue = p.matcher(_book.getTextContent()).replaceAll("");
                }

            }
            System.out.println("user" + returnValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出结果

xmlns:cas=http://www.yale.edu/tp/cas
user:ADMIN

生成XML

生成xml样例

<?xml version="1.0" encoding="GBK"?>
<Message type="request" version="1.0">
    <Head>
        <Account>zs</Account>
        <PassWord>123456</PassWord>
    </Head>
    <Body>
        <UserInfo>
            <UserName>张三</UserName>
            <deptId>01010301</deptId>
            <CardID>320481198204092420</CardID>
            <Age>23</Age>
        </UserInfo>
    </Body>
</Message>

导入相应包

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import java.util.HashMap;

生成xml方法

public static void generateXml() {
        String xml = "";
        try {
            //根节点
            Element msgEl = new Element("Message");
            msgEl.setAttribute("type", "request");
            msgEl.setAttribute("version", "1.0");
            Document doc = new Document(msgEl);

            //单个赋值
            Element headEl = new Element("Head");
            Element accountEl = new Element("Account");
            Element passWordEl = new Element("PassWord");
            accountEl.setText("zs");
            passWordEl.setText("123456");
            headEl.addContent(accountEl);
            headEl.addContent(passWordEl);

            //循环赋值
            Element bodyEl = new Element("Body");
            Element userInfoEl = new Element("UserInfo");
            HashMap<String, String> map = new HashMap();
            map.put("UserName", "张三");
            map.put("Age", "23");
            map.put("CardID", "320481198204092420");
            map.put("deptId", "01010301");
            for (String key : map.keySet()) {
                Element el = new Element(key);
                el.setText(map.get(key));
                userInfoEl.addContent(el);
            }
            bodyEl.addContent(userInfoEl);

            msgEl.addContent(headEl);
            msgEl.addContent(bodyEl);
            XMLOutputter outputter = new XMLOutputter();
            Format format = Format.getPrettyFormat();
            format.setExpandEmptyElements(true);// must
            format.setEncoding("GBK");
            outputter.setFormat(format);
            xml = outputter.outputString(doc);
            System.out.println(xml);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

输出结果

<?xml version="1.0" encoding="GBK"?>
<Message type="request" version="1.0">
  <Head>
    <Account>zs</Account>
    <PassWord>123456</PassWord>
  </Head>
  <Body>
    <UserInfo>
      <UserName>张三</UserName>
      <deptId>01010301</deptId>
      <CardID>320481198204092420</CardID>
      <Age>23</Age>
    </UserInfo>
  </Body>
</Message>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值