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

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字符串



  
    
      swift
      apple
    
    
      java
      google
    
  

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请求示例,如下图所示:

使用 dom4j 生成复杂的 xml 字符串_第1张图片
soap12请求示例.png

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

3.1.目标xml字符串



  
    
      Nanjing
      025
    
  

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 字符串)