Jsoup对于处理html.xml很强大.这里主要记录如何获取一篇xml中的某个节点
这里封装的工具类,和我上篇帖子一样.
https://blog.csdn.net/ajax_mck/article/details/88584413
依赖:
<!--xstream相关依赖-->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
<!--Jsoup相关依赖-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
相关封装如下:
public class XMLUtils {
/**
*
* @param clazz
* 类的字节码文件
* @param xml
* 传入的XML字符串
* @return XML字符串转实体类
*/
public static <T> T parseFromXml(Class<T> clazz, String xml) {
XStream xStream = new XStream(new DomDriver());
xStream.processAnnotations(clazz);
@SuppressWarnings("unchecked")
T t = (T) xStream.fromXML(xml);
return t;
}
/**
*
*
* @param obj
* 实体类
* @return 实体类转XML字符串
*/
public static String toXml(Object obj) {
XStream xStream = new XStream(new DomDriver());
// 扫描@XStream注解
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj).replaceAll("\\_+", "_");//正则过滤双下划线转为单下划线
}
/**
*
* @Description: 获取xml格式字符串中指定的元素标签片段
* @param xml
* 需要xml格式的字符串
* @param elementId
* 节点名
* @return
*/
public static String getElementString(String xml, String elementId) {
if (StringUtils.isBlank(xml) || StringUtils.isBlank(elementId)) {
return null;
}
// 获取document对象
Document document = Jsoup.parse(xml, "", new Parser(new XmlTreeBuilder()));
// 获取对应的document片段
return document.select(elementId).toString().replaceAll("\\s*", "");
}
/**
*
* @Description: xml字符串节点片段转对象
* @param xml
* @param elementId
* @param clazz
* @return
*/
public static <T> T parseElementObj(String xml, String elementId, Class<T> clazz) {
if (StringUtils.isBlank(xml) || StringUtils.isBlank(elementId)) {
return null;
}
return parseFromXml(clazz, getElementString(xml, elementId));
}
}
主要讲述重点是:要使用Jsoup来解析xml就要注入xml驱动
Document document = Jsoup.parse(xml, “”, new Parser(new XmlTreeBuilder()));
如,存在如下xml
<QUERYMSG>
<HEAD>
<SEQ></SEQ>
<NAME></NAME>
</HEAD>
<CONTENT>
<FLG>1</FLG>
<MSG>35</MSG>
</CONTENT>
</QUERYMSG>
此时想获取 CONTENT 节点,并转为实体类,这时需要进行封装
@Data
@XStreamAlias("CONTENT")
public class Content {
@XStreamAlias("FLG") //这里只要别名与xml节点一致就行.
private String F_LG; //属性任意
@XStreamAlias("MSG")
private int M_SG;
}
或者直接进行如下封装:
@Data
@XStreamAlias("CONTENT")
public class Content {
private String FLG;
private int MSG;
}
这样就可以使用工具类:
Content c = XMLUtils.parseElementObj(xml, "CONTENT", Content.class)