Java 使用 DOM 解析方式处理 XML 格式数据

126 阅读5分钟

假设通过 WebService 访问返回的 XML 字符串如下:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <getWeatherbyCityNameResponse xmlns="http://WebXml.com.cn/">
            <getWeatherbyCityNameResult>
                <string>直辖市</string>
                <string>上海</string>
                <string>58367</string>
                <string>58367.jpg</string>
                <string>2023/5/5 17:27:06</string>
                <string>17℃/25℃</string>
                <string>5月5日 中雨转阴</string>
                <string>西南风转西风3-4级</string>
                <string>8.gif</string>
                <string>2.gif</string>
                <string>今日天气实况:气温:24℃;风向/风力:西南风 1级;湿度:84%;紫外线强度:最弱。</string>
                <string>感冒指数:较易发,天凉,湿度大,较易感冒。
运动指数:较不宜,有降水,推荐您在室内进行休闲运动。
过敏指数:不易发,除特殊体质,无需担心过敏问题。
穿衣指数:舒适,建议穿长袖衬衫单裤等服装。
洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。</string>
                <string>16℃/23℃</string>
                <string>5月6日 小雨</string>
                <string>北风小于3级</string>
                <string>7.gif</string>
                <string>7.gif</string>
                <string>14℃/20℃</string>
                <string>5月7日 阴</string>
                <string>东北风小于3级</string>
                <string>2.gif</string>
                <string>2.gif</string>
                <string>上海简称:沪,位置:上海地处长江三角洲前缘,东濒东海,南临杭州湾,西接江苏,浙江两省,北界长江入海,正当我国南北岸线的中部,北纬31°14′,东经121°29′。面积:总面积7823.5平方公里。人口:人口1000多万。上海丰富的人文资源、迷人的城市风貌、繁华的商业街市和欢乐的节庆活动形成了独特的都市景观。游览上海,不仅能体验到大都市中西合壁、商儒交融、八方来风的氛围,而且能感受到这个城市人流熙攘、车水马龙、灯火璀璨的活力。上海在中国现代史上占有着十分重要的地位,她是中国共产党的诞生地。许多震动中外的历史事件在这里发生,留下了众多的革命遗迹,处处为您讲述着一个个使人永不忘怀的可歌可泣的故事,成为包含民俗的人文景观和纪念地。在上海,每到秋祭,纷至沓来的人们在这里祭祀先烈、缅怀革命历史,已成为了一种风俗。大上海在中国近代历史中,曾是风起云涌可歌可泣的地方。在这里荟萃多少风云人物,散落在上海各处的不同住宅建筑,由于其主人的非同寻常,蕴含了耐人寻味的历史意义。这里曾留下许多革命先烈的足迹。瞻仰孙中山、宋庆龄、鲁迅等故居,会使您产生抚今追昔的深沉遐思,这里还有无数个达官贵人的住宅,探访一下李鸿章、蒋介石等人的公馆,可以联想起主人那段显赫的发迹史。</string>
            </getWeatherbyCityNameResult>
        </getWeatherbyCityNameResponse>
    </soap:Body>
</soap:Envelope>

使用 DOM 解析方式处理相关代码:

import org.slf4j.*;   
import org.w3c.dom.*;  
import org.xml.sax.InputSource;  
import javax.xml.parsers.*;  
import java.io.StringReader;  

/**  
* XML 数据处理  
* @param xmlStr 为需要处理的 XML 数据(本文中为上面的 XML 字符串)
* @return  
*/  
private String xmlToString( String xmlStr ) {  
    StringBuilder result = new StringBuilder();  
    try {  
        // 使用 DOM 解析器解析 XML 数据  
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();  
        InputSource inputSource = new InputSource( new StringReader( xmlStr ) );  
        Document doc = dBuilder.parse( inputSource );  

        // 处理根节点  
        doc.getDocumentElement().normalize();  

        // 处理子节点  
        NodeList nList = doc.getElementsByTagName( "getWeatherbyCityNameResult" );  
        for ( int i = 0; i < nList.getLength(); i++ ) {  
            Node nNode = nList.item(i);  
            if ( Node.ELEMENT_NODE == nNode.getNodeType() ) {  
                Element eElement = ( Element ) nNode;  
                String content = eElement.getTextContent();  
                result.append( content + " " );  
            }  
        }  
        log.info( "XML 格式处理数据: " + result);  
    } catch ( Exception e ) {  
        log.error( "XML 格式处理异常: ", e );  
    } 
    return result.toString();  
}

也可以使用 hutool 类库提供的 XmlUtil 工具来处理,示例代码如下:

pom.xml 引入依赖

<!-- hutool 工具jar 文档网址:https://www.hutool.cn/docs/#/ -->  
<dependency>  
    <groupId>cn.hutool</groupId>  
    <artifactId>hutool-all</artifactId>  
    <version>5.4.3</version>  
</dependency>

处理代码:

import cn.hutool.core.util.XmlUtil;  
import org.slf4j.*;  
import org.w3c.dom.*;

/**  
* XML 数据处理 (使用 hutool XmlUtil 工具处理 )  
* @param xmlStr 为需要处理的 XML 数据(本文中为上面的 XML 字符串)  
* @return  
*/  
private String xmlToString( String xmlStr ) {  
    StringBuilder result = new StringBuilder();  
    try {  
        // 解析 XML 字符串为 Document 对象  
        Document doc = XmlUtil.parseXml( xmlStr );  
        // 获取 XML 文档的根节点  
        Element rootElement = XmlUtil.getRootElement( doc );  
        // 根据节点名获得子节点列表  
        NodeList nList = rootElement.getElementsByTagName( "getWeatherbyCityNameResult" );  
        for ( int i = 0; i < nList.getLength(); i++ ) {  
            Node nNode = nList.item(i);  
            if ( Node.ELEMENT_NODE == nNode.getNodeType() ) {  
                Element eElement = ( Element ) nNode;  
                String content = eElement.getTextContent();  
                result.append( content + " " );  
            }  
        }  
        log.info( "XML 格式处理数据: " + result);  
    } catch ( Exception e ) {  
        log.error( "XML 格式处理异常: ", e );  
    }  
    return result.toString();  
}

最终处理效果:

{
	"code": 200,
	"msg": "操作成功",
	"data": "直辖市上海5836758367.jpg2023/5/6 10:40:1515℃/23℃5月6日 小雨北风小于3级7.gif7.gif今日天气实况:气温:21℃;风向/风力:东北风 1级;湿度:77%;紫外线强度:最弱。感冒指数:较易发,天凉,湿度大,较易感冒。\n运动指数:较不宜,有降水,推荐您在室内进行休闲运动。\n过敏指数:较易发,外出需远离过敏源,适当采取防护措施。\n穿衣指数:较舒适,建议穿薄外套或牛仔裤等服装。\n洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。\n紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。\n14℃/19℃5月7日 小雨转阴东北风小于3级7.gif2.gif14℃/21℃5月8日 阴转多云东北风小于3级2.gif1.gif上海简称:沪,位置:上海地处长江三角洲前缘,东濒东海,南临杭州湾,西接江苏,浙江两省,北界长江入海,正当我国南北岸线的中部,北纬31°14′,东经121°29′。面积:总面积7823.5平方公里。人口:人口1000多万。上海丰富的人文资源、迷人的城市风貌、繁华的商业街市和欢乐的节庆活动形成了独特的都市景观。游览上海,不仅能体验到大都市中西合壁、商儒交融、八方来风的氛围,而且能感受到这个城市人流熙攘、车水马龙、灯火璀璨的活力。上海在中国现代史上占有着十分重要的地位,她是中国共产党的诞生地。许多震动中外的历史事件在这里发生,留下了众多的革命遗迹,处处为您讲述着一个个使人永不忘怀的可歌可泣的故事,成为包含民俗的人文景观和纪念地。在上海,每到秋祭,纷至沓来的人们在这里祭祀先烈、缅怀革命历史,已成为了一种风俗。大上海在中国近代历史中,曾是风起云涌可歌可泣的地方。在这里荟萃多少风云人物,散落在上海各处的不同住宅建筑,由于其主人的非同寻常,蕴含了耐人寻味的历史意义。这里曾留下许多革命先烈的足迹。瞻仰孙中山、宋庆龄、鲁迅等故居,会使您产生抚今追昔的深沉遐思,这里还有无数个达官贵人的住宅,探访一下李鸿章、蒋介石等人的公馆,可以联想起主人那段显赫的发迹史。 ",
	"datas": {}
}