可实现将xml节点数据封装为key-value map,通过键值访问节点和属性值。支持多级结构,支持属性值和节点值的读取。

1、引入dom4j和common工具包

        <!-- dom4j -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

2、将工具类ctrl v到项目中

package com.ty.ex.util;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * xml解析工具类
 *
 * @author timi
 */
public class XmlUtils {

    /**
     * xml解析器
     *
     * @param xml  xml字符串
     * @param filterRootEleName 匹配的根节点名
     * @return
     * @返回map,格式:键:值
     * @返回属性值:->节点名=>属性名:属性值
     * @返回节点值:->节点名:值
     * @返回子节点属性值:->节点名->子节点名=>属性名:属性值
     * @返回子节点值:->节点名->子节点名:属性值
     */
    public static Map<String, Object> xmlParser(String xml, String filterRootEleName) {
        Map<String, Object> retMap = new HashMap<>();
        //1.创建Reader对象
        try {
            SAXReader reader = new SAXReader();
            InputStream targetStream = IOUtils.toInputStream(xml, StandardCharsets.UTF_8.name());
            Document document = reader.read(targetStream);
            //3.获取根节点
            Element rootElement = document.getRootElement();
            StringBuilder builder = new StringBuilder();
            parser(rootElement, builder, filterRootEleName, retMap);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return retMap;
    }

    /**
     * xml递归解析器
     *
     * @param ele    解析节点
     * @param eleKey 上级节点key
     * @param retMap 返回map
     */
    private static void parser(Element ele, StringBuilder eleKey, String firstEleName, Map<String, Object> retMap) {
        StringBuilder builder = new StringBuilder(eleKey.toString());
        if (StringUtils.isEmpty(firstEleName)
                || firstEleName.equals(ele.getName())) {
            firstEleName = null;
            builder.append("->" + ele.getName());
            if (org.apache.commons.lang3.StringUtils.isNotEmpty(org.apache.commons.lang3.StringUtils.stripToEmpty(ele.getData() + ""))) {
                retMap.put(builder.toString(), org.apache.commons.lang3.StringUtils.stripToEmpty(ele.getData() + ""));
            }
            List<Attribute> attributes = ele.attributes();
            for (Attribute attribute : attributes) {
                StringBuilder builder1 = new StringBuilder(builder.toString());
                builder1.append("=>" + attribute.getName());
                if (StringUtils.isNotEmpty(attribute.getValue())) {
                    retMap.put(builder1.toString(), attribute.getValue());
                }
            }
        }
        Iterator iterator1 = ele.elementIterator();
        while (iterator1.hasNext()) {
            Element eleChild = (Element) iterator1.next();
            parser(eleChild, builder, firstEleName, retMap);
        }
    }

    public static void main(String[] args) {
        String xml = "<PRPM_IN401030UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 ../multicacheschemas/PRPM_IN401030UV01.xsd\"><id root=\"\" extension=\"8D73520B-D489-4B70-8F4B-7B5C2D7961B5\"/><creationTime value=\"20130116112855\"/><interactionId root=\"2.16.840.1.113883.1.6\" extension=\"JH0601\"/><processingCode code=\"P\"/><processingModeCode code=\"I\"/><acceptAckCode code=\"AL\"/><receiver typeCode=\"RCV\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.0.1.1\" extension=\" \"/></device></receiver><sender typeCode=\"SND\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.0.1.2\" extension=\" \"/></device></sender><controlActProcess classCode=\"CACT\" moodCode=\"EVN\"><code code=\"PRPM_TE401010UV01\" codeSystem=\"2.16.840.1.113883.1.6\"/><subject typeCode=\"SUBJ\"><registrationRequest classCode=\"REG\" moodCode=\"RQO\"><statusCode code=\"active\"/><subject1 typeCode=\"SBJ\"><qualifiedEntity classCode=\"QUAL\"><code></code><effectiveTime/></qualifiedEntity><assignedEntity classCode=\"ASSIGNED \"><id root=\"2.16.156.10011.1.26\" extension=\"1234567890\"/><code code=\"A03.01\" displayName=\"呼吸内科专业\" codeSystem=\"2.16.156.10011.2.3.2.62\" codeSystemName=\"医疗卫生机构业务科室分类与代码表\"/><name flavorId=\"NK\">内科</name><addr/><telecom/><statusCode code=\"active\"/><effectiveTime><low value=\"20100101\"/><high value=\"20501231\"/></effectiveTime><assignedPrincipalOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id>123</id><name>呼吸内科1</name><asAffiliate classCode=\"AFFL\"><code/><effectiveTime/><affiliatedPrincipalOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.1.26\" extension=\"0234567890\"/><name>内科</name></affiliatedPrincipalOrganization></asAffiliate></assignedPrincipalOrganization></assignedEntity><ExtendedAttribute classCode=\"EXTENDED\"><subjectOf2 typeCode=\"SBJ\"><roleActivation><reasonCode><displayName><translation flavorId=\"DelFlag\" value=\"0\"/></displayName><originalText><translation flavorId=\"kszx\" code=\"2\" value=\"医技\" displayName=\"一级机构\"/><translation flavorId=\"kszyxz\" code=\"301001\" value=\"病理科\" displayName=\"二级机构\"/><translation flavorId=\"kslb\" code=\"0\" value=\"门诊\" displayName=\"科室类别\"/><translation flavorId=\"kslb\" code=\"1\" value=\"中心医院\" displayName=\"所属院区\"/></originalText></reasonCode></roleActivation></subjectOf2></ExtendedAttribute></subject1><author typeCode=\"AUT\"><assignedEntity classCode=\"ASSIGNED\"><id root=\"2.16.156.10011.1.4\" extension=\"120109197706015518\"/><assignedPerson classCode=\"PSN\" determinerCode=\"INSTANCE\"><name>李人事</name></assignedPerson><representedOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.1.26\" extension=\"xxx12345-X\"/><name>人事科</name><contactParty classCode=\"CON\"><contactPerson classCode=\"PSN\" determinerCode=\"INSTANCE\"><name>王联系</name></contactPerson></contactParty></representedOrganization></assignedEntity></author></registrationRequest></subject></controlActProcess></PRPM_IN401030UV01>";
        Map<String, Object> retMap = XmlUtils.xmlParser(xml, "PRPM_IN401030UV01");

        /* @返回map,格式:键:值
         * @返回属性值:->节点名=>属性名:属性值
         * @返回节点值:->节点名:值
         * @返回子节点属性值:->节点名->子节点名=>属性名:属性值
         * @返回子节点值:->节点名->子节点名:值
         */
        String code = String.valueOf(retMap.get("->PRPM_IN401030UV01->processingModeCode=>code"));
    }
}

3、使用示例

 public static void main(String[] args) {
        String xml = "<PRPM_IN401030UV01 xmlns=\"urn:hl7-org:v3\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ITSVersion=\"XML_1.0\" xsi:schemaLocation=\"urn:hl7-org:v3 ../multicacheschemas/PRPM_IN401030UV01.xsd\"><id root=\"\" extension=\"8D73520B-D489-4B70-8F4B-7B5C2D7961B5\"/><creationTime value=\"20130116112855\"/><interactionId root=\"2.16.840.1.113883.1.6\" extension=\"JH0601\"/><processingCode code=\"P\"/><processingModeCode code=\"I\"/><acceptAckCode code=\"AL\"/><receiver typeCode=\"RCV\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.0.1.1\" extension=\" \"/></device></receiver><sender typeCode=\"SND\"><device classCode=\"DEV\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.0.1.2\" extension=\" \"/></device></sender><controlActProcess classCode=\"CACT\" moodCode=\"EVN\"><code code=\"PRPM_TE401010UV01\" codeSystem=\"2.16.840.1.113883.1.6\"/><subject typeCode=\"SUBJ\"><registrationRequest classCode=\"REG\" moodCode=\"RQO\"><statusCode code=\"active\"/><subject1 typeCode=\"SBJ\"><qualifiedEntity classCode=\"QUAL\"><code></code><effectiveTime/></qualifiedEntity><assignedEntity classCode=\"ASSIGNED \"><id root=\"2.16.156.10011.1.26\" extension=\"1234567890\"/><code code=\"A03.01\" displayName=\"呼吸内科专业\" codeSystem=\"2.16.156.10011.2.3.2.62\" codeSystemName=\"医疗卫生机构业务科室分类与代码表\"/><name flavorId=\"NK\">内科</name><addr/><telecom/><statusCode code=\"active\"/><effectiveTime><low value=\"20100101\"/><high value=\"20501231\"/></effectiveTime><assignedPrincipalOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id>123</id><name>呼吸内科1</name><asAffiliate classCode=\"AFFL\"><code/><effectiveTime/><affiliatedPrincipalOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.1.26\" extension=\"0234567890\"/><name>内科</name></affiliatedPrincipalOrganization></asAffiliate></assignedPrincipalOrganization></assignedEntity><ExtendedAttribute classCode=\"EXTENDED\"><subjectOf2 typeCode=\"SBJ\"><roleActivation><reasonCode><displayName><translation flavorId=\"DelFlag\" value=\"0\"/></displayName><originalText><translation flavorId=\"kszx\" code=\"2\" value=\"医技\" displayName=\"一级机构\"/><translation flavorId=\"kszyxz\" code=\"301001\" value=\"病理科\" displayName=\"二级机构\"/><translation flavorId=\"kslb\" code=\"0\" value=\"门诊\" displayName=\"科室类别\"/><translation flavorId=\"kslb\" code=\"1\" value=\"中心医院\" displayName=\"所属院区\"/></originalText></reasonCode></roleActivation></subjectOf2></ExtendedAttribute></subject1><author typeCode=\"AUT\"><assignedEntity classCode=\"ASSIGNED\"><id root=\"2.16.156.10011.1.4\" extension=\"120109197706015518\"/><assignedPerson classCode=\"PSN\" determinerCode=\"INSTANCE\"><name>李人事</name></assignedPerson><representedOrganization classCode=\"ORG\" determinerCode=\"INSTANCE\"><id root=\"2.16.156.10011.1.26\" extension=\"xxx12345-X\"/><name>人事科</name><contactParty classCode=\"CON\"><contactPerson classCode=\"PSN\" determinerCode=\"INSTANCE\"><name>王联系</name></contactPerson></contactParty></representedOrganization></assignedEntity></author></registrationRequest></subject></controlActProcess></PRPM_IN401030UV01>";
        Map<String, Object> retMap = XmlUtils.xmlParser(xml, "PRPM_IN401030UV01");

        /* @返回map,格式:键:值
         * @返回属性值:->节点名=>属性名:属性值
         * @返回节点值:->节点名:值
         * @返回子节点属性值:->节点名->子节点名=>属性名:属性值
         * @返回子节点值:->节点名->子节点名:值
         */
        String code = String.valueOf(retMap.get("->PRPM_IN401030UV01->processingModeCode=>code"));
    }

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐