首页 > 编程语言 >【JAVA】Java 使用 XPath表达式定位节点读取自定义XML方法

【JAVA】Java 使用 XPath表达式定位节点读取自定义XML方法

时间:2024-02-04 16:13:49浏览次数:30  
标签:XPath Java 自定义 expr resultMap param doc 节点

     * 加载配置文件节点
     * @param attributeValue 节点属性值
     * @param areaCode       节点属性值
     */
    public static Map<String,String> getConfigXml(String attributeValue,String areaCode){
        String filePath="config.xml";
        Map<String,String> resultMap=new HashMap<>();
        try{
            File xmlFile=new File(filePath);
            // 创建DocumentBuilderFactory和DocumentBuilder
            DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
            // 使用DocumentBuilder解析XML文件
            Document doc=dBuilder.parse(xmlFile);
            // 创建XPath对象
            XPathFactory xPathFactory=XPathFactory.newInstance();
            XPath xpath=xPathFactory.newXPath();
            // 使用XPath 表达式定位节点
            XPathExpression expr=xpath.compile("//project[@val='"+attributeValue+"']/item[@areacode='"+areaCode+"']");
            resultMap=parseItemsWithAttribute(doc,expr);
            System.out.println(resultMap);
            System.out.println("count: "+resultMap.get("count"));
        }catch(Exception e){
            e.printStackTrace();
            throw new ServiceException("getConfigXml方法异常");
        }
        return resultMap;
    }

     * 加载xml,并返回map集合
     *
     * @param doc  解析的xml
     * @param expr 节点定位表达式
     * @author wyj
     * @date 2023-12-08
     */
    private static Map<String,String> parseItemsWithAttribute(Document doc,XPathExpression expr){
        Map<String,String> resultMap=new HashMap<>();
        try{

            // 获取匹配的节点
            Node itemNodes=(Node)expr.evaluate(doc,XPathConstants.NODE);
            //获取节点下的子节点
            NodeList childNodes=itemNodes.getChildNodes();
            // 遍历节点列表并获取子节点的值
            for(int i=0;i<childNodes.getLength();i++){
                Node childNode=childNodes.item(i);
                if(childNode.getNodeType()==Node.ELEMENT_NODE){
                    String childNodeName=childNode.getNodeName();
                    String childNodeValue=childNode.getTextContent();
                    resultMap.put(childNodeName,childNodeValue);
                }
            }
        }catch(XPathExpressionException e){
            e.printStackTrace();
            throw new ServiceException("parseItemsWithAttribute方法异常");
        }
        return resultMap;
    }


自定义XML <?xml version="1.0" encoding="utf-8"?> <body> <project val="one"> <item areacode="72"> <dsecribe>测试</dsecribe> <count>5</count> </item> <item areacode="42"> <dsecribe>测试2</dsecribe> <count>5</count> </item> </project> <!--这个节点要通过改变定位表达式来获取--> <project val="AreaRelevance"> <item> <regionArea>72</regionArea> <ShengArea>31,32,33,34,35,36</ShengArea> </item> </project> </body>

  

标签:XPath,Java,自定义,expr,resultMap,param,doc,节点
From: https://www.cnblogs.com/WuUranus/p/18006420

相关文章

  • [word] word自定义编号格式怎么设置
    在Word文档的编辑中,经常会给段落添加编号,但是在编号的使用过程中我们会遇到很多问题,今天给大家分享word自定义编号格式怎么设置,希望能帮到您! 1.如何自定义编号格式?点击文件左上角的【开始】菜单按钮—进入【段落】-选择【编号】-选择【定义新编号格式】,在【编号样式】中选择一个合......
  • 深入浅出Java多线程(七):重排序与Happens-Before
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第七篇内容:重排序与Happens-Before。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在上一篇文章中,我们简单提了一下重排序与Happens-Before。在这篇文章中我们将深入讲解一下重排序与Happens-Before,然......
  • java代码实现自动生成数据库表er图
    最近有同事看到字节跳动产品设计文档里有数据库表er图。就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有。因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具就算生成了也没有描述关系的连接线。那么为了满足需求,这边就略微出手写了个代码......
  • 【DM】自定义存储函数(返回字符在字符串中所在位置的下标字符串)
    一、使用while语法--输入:原字符串,查找的字符,分割字符--输出:所在位置下标集合(用输入的分割字符分割)CREATEORREPLACEFUNCTIONdF_strPosition(strInputINVARCHAR(100),strFindinputINVARCHAR(2),strSplitINVARCHAR(2))RETURNVARCHAR(128)ASstrVal......
  • Xpath的基本使用
    XPath(全称:XMLPathLanguage)即XML路径语言,它是一门在XML文档中查找信息的语言,最初被用来搜寻XML文档,同时它也适用于搜索HTML文档,因此,自动化测试中可以使用XPath寻找目标节点操作,在爬虫过程中可以使用XPath来提取相应的数据。Xpath使用路径表达式来选取XML/HTML文档......
  • Java AQS
    AQS介绍AQS的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS就是一个抽象类,主要用来构建锁和同步器。publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizer......
  • Java压缩文件为ZIP并加密
    1:引入jar包<dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.1</version></dependency> 2:单文件压缩 importnet.lingala.z......
  • javaee平台技术
    3.spring和springboot3.3spring容器BeanFactory:创建Bean对象以及管理Bean对象。 ApplicationContext:BeanFactory的子接口,继承了其所有能力外,还追加了其他功能。  控制反转实现机制:将对象间的依赖交给容器去处理,利用set或构造函数的方法把依赖注射进来,告诉其关联关系,主......
  • 几个高级 JavaScript 技巧
    赋值解构:赋值解构是一种从数组或对象中提取值并将其分配给变量的简洁方法。它简化了代码并提高了可读性。对于数组,您可以使用方括号表示法,对于对象可以使用大括号。扩展语法:可以使用扩展语法将数组的元素或对象的属性扩展到另一个数组或对象。这对于制作副本、合并对象以及将多个......
  • java直连mysql操作数据
    连接器importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/***@author:chenKeFeng*@date:2024/1/3010:21*/publicclassMySQLConnector{pri......