美文网首页微信公众号开发Web Service程序员
使用 dom4j 生成复杂的 xml 字符串

使用 dom4j 生成复杂的 xml 字符串

作者: Jefitar | 来源:发表于2018-01-31 11:05 被阅读60次

    1. 概述

    dom4j 是 dom4j.org 出品的一个开源XML解析包,应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。如今可以看到越来越多的Java软件都在使用 dom4j 来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

    点击 dom4j 下载不同版本的 jar 包,下载后,添加到eclipse的build path中,即可使用。

    2. 简单示例

    2.1. 目标xml字符串

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <root>
      <platform>
        <type name="iOS">
          <language>swift</language>
          <company>apple</company>
        </type>
        <type name="Android">
          <language>java</language>
          <company>google</company>
        </type>
      </platform>
    </root>
    

    2.2. 代码

    public static String genXmlStr(){
        Document doc = DocumentHelper.createDocument();
    
        Element rootEle = doc.addElement("root");
        Element platformEle = rootEle.addElement("platform");
    
        Element typeEle = platformEle.addElement("type");
        typeEle.addAttribute("name", "iOS");
        Element languageEle = typeEle.addElement("language");
        languageEle.setText("swift");
        Element companyEle = typeEle.addElement("company");
        companyEle.setText("apple");
    
        typeEle = platformEle.addElement("type");
        typeEle.addAttribute("name", "Android");
        languageEle = typeEle.addElement("language");
        languageEle.setText("java");
        companyEle = typeEle.addElement("company");
        companyEle.setText("google");
        
        OutputFormat format = OutputFormat.createCompactFormat();
        StringWriter writer = new StringWriter();
        XMLWriter output = new XMLWriter(writer, format);
    
        try {
              output.write(doc);
              writer.close();
              output.close();
              System.out.println(writer.toString());
        }  catch (IOException e) {
              e.printStackTrace();
              return null;
        }
    
        return writer.toString();
    }
    

    通过以上代码,即可生成2.1节目标字符串。

    3. 实战示例

    在实际项目中,目标xml字符串不会如此简单。我们打开网上的一个
    WebService 示例:WeatherWebService ,可以看到其暴露了5个接口,打开接口 getWeatherbyCityNamePro(),可以看到调用该接口所需要的soap12请求示例,如下图所示:

    soap12请求示例.png
    要想调用getWeatherByCityNamePro()接口,要生成下节所示的xml字符串作为post的请求参数。

    3.1.目标xml字符串

    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <getWeatherbyCityNamePro xmlns="http://WebXml.com.cn/">
          <theCityName>Nanjing</theCityName>
          <theUserID>025</theUserID>
        </getWeatherbyCityNamePro>
      </soap12:Body>
    </soap12:Envelope>
    

    3.2. 代码

    public static String genLoginRequestStr1(String accountType, String phoneNum, String password, String openId,
            String wxoaOpenid) {
    
        // 第一种方法 上文中已使用过
        // Document doc = DocumentHelper.createDocument();
        // Element root = doc.addElement("soap12:Envelope");
    
        // 还可以使用第二种方法
        Element root = DocumentHelper.createElement("soap12:Envelope");
        Document doc = DocumentHelper.createDocument(root);
    
        root.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
        root.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
        root.addAttribute("xmlns:soap12", "http://www.w3.org/2003/05/soap-envelope");
    
        Element bodyEle = DocumentHelper.createElement("soap12:Body");
        root.add(bodyEle );
    
        Element methodEle = bodyEle .addElement("getWeatherbyCityNamePro", "http://WebXml.com.cn/");// 接口名称 命名空间
    
        Element cityEle= methodEle .addElement("theCityName");
        cityEle.setText("Nanjing");
    
        Element userEle= methodEle .addElement("theUserID");
        userEle.setText("025");
    
        OutputFormat format = OutputFormat.createCompactFormat();// createPrettyPrint() 层次格式化
        StringWriter writer = new StringWriter();
        XMLWriter output = new XMLWriter(writer, format);
    
        try {
            output.write(doc);
            writer.close();
            output.close();
            System.out.println("requestXml: " + writer.toString());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    
        return writer.toString();
    }
    

    通过以上代码,即可生成3.1节目标字符串。

    相关文章

      网友评论

        本文标题:使用 dom4j 生成复杂的 xml 字符串

        本文链接:https://www.haomeiwen.com/subject/xthwwxtx.html