一、如何添加前缀
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 官网