java dom4j生成带前缀的xml

 一、如何添加前缀

 1.引入dom4j

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.1</version>
        </dependency>

 2.借助 QName(String prefix,NameSpace namespace) 为其添加前缀

    public static void dom4jTest(){
        Document document = DocumentHelper.createDocument();
        Namespace env = new Namespace("XXX-ENV", "http://xxx/xx");
        Namespace m = new Namespace("m", "http://xxx/xx/xxx");
        Element root = document.addElement(new QName("ROOT", env))
                .addNamespace(env.getPrefix(), env.getURI())
                .addNamespace(m.getPrefix(), m.getURI());
        Element header = root.addElement(new QName("Header", env));
        Element body = root.addElement(new QName("Body", env));
        header.addElement(new QName("MEName",m));
        Element authentication =
                header.addElement(new QName("Authentication", m));
        authentication.addElement(new QName("Username",m))
                .addText("username");
        authentication.addElement(new QName("Password",m))
                .addText("password");
        System.out.println(document.asXML());
    }

3.生成的xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<XXX-ENV:ROOT xmlns:XXX-ENV="http://xxx/xx" xmlns:m="http://xxx/xx/xxx">
    <XXX-ENV:Header>
        <m:MEName/>
        <m:Authentication>
            <m:Username>username</m:Username>
            <m:Password>password</m:Password>
        </m:Authentication>
    </XXX-ENV:Header>
    <XXX-ENV:Body/>
</XXX-ENV:ROOT>

二、 JAXBContext 将 java类 转xml

1.工具类

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

public class ObjToXmlUtil {

    /**
     * 将对象直接转换成String类型的 XML输出
     *
     * @param obj xml对象
     * @param encode 编码-UTF-8
     * @return
     */
    public static String convertToXml(Object obj,String encode) {
        // 创建输出流
        StringWriter sw = new StringWriter();
        //sw.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        try {
            // 利用jdk中自带的转换类实现
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
           // marshaller.setProperty(Marshaller.JAXB_ENCODING, encode);

//            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); //删除默认的<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
//            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);// 格式化xml输出的格式,每条属性会自动换行,可以不用格式化

            // 将对象转换成输出流形式的xml
            marshaller.marshal(obj, sw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return sw.toString();
    }

}

 2.自定义要转换的java类

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

@Data
@Accessors(chain = true)
@XmlRootElement(name="xmlEntity")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlEntity {
    private String data;
    private String username;
    private String password;
}

3.使用工具类转换实体类

XmlEntity xmlEntity = new XmlEntity();
        xmlEntity.setUsername("userName2")
                .setPassword("pwd");
        String s = ObjToXmlUtil.convertToXml(xmlEntity, "UTF-8");
        System.out.println(s);

        实体类中共有三个属性,其中 data 属性为空,这样生成的xml就没有这一属性,如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlEntity>
    <username>userName2</username>
    <password>pwd</password>
</xmlEntity>

 三、dom4j结合JAXBContext使用

         结合一、二中的例子基本可以自动生成想要的xml了

        Document document = DocumentHelper.createDocument();
        Namespace env = new Namespace("XXX-ENV", "http://xxx/xx");
        Namespace m = new Namespace("m", "http://xxx/xx/xxx");
        Element root = document.addElement(new QName("ROOT", env))
                .addNamespace(env.getPrefix(), env.getURI())
                .addNamespace(m.getPrefix(), m.getURI());
        Element header = root.addElement(new QName("Header", env));
        Element body = root.addElement(new QName("Body", env));
        header.addElement(new QName("MEName", m));
        Element authentication =
                header.addElement(new QName("Authentication", m));
        authentication.addElement(new QName("Username", m))
                .addText("username");
        authentication.addElement(new QName("Password", m))
                .addText("password");
//        System.out.println(document.asXML());
        //ObjToXml
        XmlEntity xmlEntity = new XmlEntity();
        xmlEntity.setUsername("userName2")
                .setPassword("pwd")
                .setData("NANANANANANANANANANANA");
        String s = ObjToXmlUtil.convertToXml(xmlEntity, "UTF-8");
//        System.out.println(s);
        //两者结合
        SAXReader saxReader = new SAXReader();
        Document entity = saxReader
                //这里借助字节流传递生成的xml,不然会乱码
                .read(new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8)));
        //拿到解析后的 root节点
        Element entityRoot = entity.getRootElement();
        //为 root 节点添加 m前缀
        entityRoot.setQName(new QName(entityRoot.getName(),m));
        //为 root节点 所有子节点添加 m前缀
        entityRoot.elements().forEach(e ->e.setQName(new QName(e.getName(), m)));
        //放到前面例子中的 body节点
        body.add(entityRoot);
        //打印输出
        System.out.println(document.asXML());

        生成结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<XXX-ENV:ROOT xmlns:XXX-ENV="http://xxx/xx" xmlns:m="http://xxx/xx/xxx">
    <XXX-ENV:Header>
        <m:MEName/>
        <m:Authentication>
            <m:Username>username</m:Username>
            <m:Password>password</m:Password>
        </m:Authentication>
    </XXX-ENV:Header>
    <XXX-ENV:Body>
        <m:xmlEntity>
            <m:data>NANANANANANANANANANANA</m:data>
            <m:username>userName2</m:username>
            <m:password>pwd</m:password>
        </m:xmlEntity>
    </XXX-ENV:Body>
</XXX-ENV:ROOT>

 四、定制xml细节

1.顺序

        jaxb生成的顺序和自己定义的java类的顺序一致,可以调整自己的类中属性的顺序来调整生成的xml顺序

@Data
@Accessors(chain = true)
@XmlRootElement(name="xmlEntity")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlEntity {
    private String username;
    private String password;
    private String data;
    private String a;
}
<m:xmlEntity>
    <m:username>userName2</m:username>
    <m:password>pwd</m:password>
    <m:data>NANANANANANANANANANANA</m:data>
    <m:a>a</m:a>
</m:xmlEntity>

 2.根据注解或者去官网查看细节

         JAXB常用注解讲解(超详细)_HOLD ON!的博客-CSDN博客

        dom4j 官网

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值