使用Document解析xml格式的文件(以P3C扫描结果为例)

2023-05-16

一、xml文件格式(以P3C扫描结果为例)

二、示例代码

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author shtq.001
 */
public class XmlTest2 {
    public static void main(String[] args) {
        String directory = "F:\\p3c";
        File file = new File(directory);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            List<Map<String, Object>> resultList = new ArrayList<>();
            for (int i = 0; i < files.length; i++) {
                if (!files[i].exists()) {
                    System.out.println("xml文件不存在,请确认!");
                } else {
                    List<Map<String, Object>> tempList = parseXML(files[i]);
                    if (tempList != null && tempList.size() > 0) {
                        resultList.addAll(tempList);
                    }
                }
            }
            System.err.println(resultList.size());
            for (Map<String, Object> map : resultList) {
                System.err.println(map);
            }
        }
    }

    /**
     * 解析xml文件
     *
     * @param file
     * @return
     */
    public static List<Map<String, Object>> parseXML(File file) {
        // 初始化一个XML解析工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 创建一个DocumentBuilder实例
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
            // 创建一个解析XML的Document实例
            Document document = builder.parse(file);
            // 获取根节点
            Element root = document.getDocumentElement();
            List<Map<String, Object>> resultList = new ArrayList<>();
            resultList = parseElement(root, resultList);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return resultList ;
    }

    public static List<Map<String, Object>> parseElement(Element element, List<Map<String, Object>> resultList){
        NodeList nodeList = element.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            Map<String, Object> map = new HashMap<>(16);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                if("problem".equals(node.getNodeName())){
                    NodeList nodeList1 = node.getChildNodes();
                    for (int j = 0; j < nodeList1.getLength(); j++) {
                        Node childNode = nodeList1.item(j);
                        if("file".equals(childNode.getNodeName())){
                            map.put("file", childNode.getTextContent());
                        } else if("line".equals(childNode.getNodeName())){
                            map.put("line", childNode.getTextContent());
                        } else if("problem_class".equals(childNode.getNodeName())){
                            map.put("problem", childNode.getTextContent());
                            NamedNodeMap namedNodeMap =  childNode.getAttributes();
                            for (int k = 0; k < namedNodeMap.getLength(); k++) {
                                Attr attr = (Attr) namedNodeMap.item(k);
                                if("severity".equals(attr.getName())){
                                    map.put("severity", attr.getValue());
                                }
                            }
                        } else if("description".equals(childNode.getNodeName())){
                            map.put("suggestion", childNode.getTextContent());
                        } else if("entry_point".equals(childNode.getNodeName())){
                            NamedNodeMap namedNodeMap =  childNode.getAttributes();
                            for (int m = 0; m < namedNodeMap.getLength(); m++) {
                                Attr attr = (Attr) namedNodeMap.item(m);
                                if("FQNAME".equals(attr.getName())){
                                    map.put("functionName", attr.getValue());
                                }
                            }
                        }
                    }
                    resultList.add(map);
                }
            }
        }
        return resultList;
    }
}

三、运行结果

{severity=BLOCKER, file=file://$PROJECT_DIR$/src/main/java/basicstudy/thread/ExecutorsTest.java, problem=线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。, functionName=basicstudy.thread.ExecutorsTest void newSingleThreadTest(), line=26, suggestion=手动创建线程池,效果会更好哦。 (line 26)}
{severity=BLOCKER, file=file://$PROJECT_DIR$/src/main/java/basicstudy/thread/ExecutorsTest.java, problem=线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。, functionName=basicstudy.thread.ExecutorsTest void newCachedThreadPoolTest(), line=75, suggestion=手动创建线程池,效果会更好哦。 (line 75)}
{severity=BLOCKER, file=file://$PROJECT_DIR$/src/main/java/basicstudy/thread/ExecutorsTest.java, problem=线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。, functionName=basicstudy.thread.ExecutorsTest void newFixedThreadPoolTest(), line=49, suggestion=手动创建线程池,效果会更好哦。 (line 49)}

 四、说明

     代码写的简单粗暴,没有经过优化,大家如有意见,欢迎评论,谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Document解析xml格式的文件(以P3C扫描结果为例) 的相关文章

  • SQL Server 2008 XPath

    我们尝试根据我们提供的值过滤一组 XML 我们的数据库的 XML 字段中有以下 XML 如果传递数字 5052095050830 我们需要在 XML 中找到这个特定节点 我们提供的号码可能存在任意多次 任何机构都可以提供一些 SQL 示例来
  • InstallShield XML 文件更改 - 安装时更改节点属性

    我正在使用 InstallShield 2012 构建 Web 服务安装 并且需要根据用户输入修改应用程序的 Web config 文件 我在 DestinationFolder 对话框之后引入了 PromptServerAndDataba
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • 在 CollapsingToolbarLayout 中设置 minHeight 没有任何效果

    我目前使用 CollapsingToolbarLayout 遇到的主要问题是 无论我尝试什么 工具栏的 minHeight 属性都没有任何效果 我想要的结果是这样的 CollapsingToolbarLayout 具有一定的展开高度和一定的
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • 具有挑战性的问题 - 使用 PHP 对 XML 数据进行排序

    我有 xml 文件 其中包含大量产品数据 我需要根据我的字段 ProductRange 的数据对我的产品进行排序 ProductRange urldecode GET Range XML 文件数据
  • Cocoa 基于文档的应用程序中的 MVC

    我目前正在对我的应用程序进行重构和重组 我意识到模型和视图及其控制器之间的一些分离已经减少 我希望进行一些清理 我的应用程序中使用了几个关键类 NSPersistentDocument NSWindowController 和模型类 NSP
  • 使用 Retrofit 2 解析 XML

    我试图从央行获取汇率 不幸的是他们没有可以提供 JSON 数据的 api 仅在 XML 中 我正在使用 Retrogit 2 我已经创建了两个类 它们描述了我从网站获得的 xml 但是当我尝试获取回调的响应时 我收到了 404 错误代码 也
  • 如何成功地用 XML 中的批处理替换文本

    我尝试使用批处理在 XML 页面中替换字符串 但无法成功完全替换它 我有这个批处理代码 echo off setlocal EnableDelayedExpansion set search logLevel 3 set replace l
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • PHP 和 DOM 文档

    我有一个关于 DOMDocument 的使用和创建 XML 的问题 我有一个 PHP 程序 加载到 XML 文件中 处理XML的每个节点 行 将其发送到另一个进程 然后该进程返回一个 XML 元素 我获取节点的字符串表示形式 以便可以创建
  • 主题以编程方式设置。如何重新加载 Activity 来应用

    如何在不重新启动整个应用程序的情况下应用主题 如果我这样做startActivity getIntent finish 活动退出并且不重新启动 是否可以简单地重新启动 重新创建活动来应用主题 它的顺序不正确 finish intent ne
  • 通过 XML 将重复事件添加到 Google 日历

    我正在尝试通过协议 API 将重复事件添加到我的日历中 我从在 Google 界面中创建的事件中获取了重复标记的语法 并将其用于我的创建请求中 这是我提交的内容
  • XSLT - 追加同级

    我正在尝试使用 XSLT 来附加context param作为最后一个兄弟姐妹 没有共同的父元素 因此任务有点困难 我想附加以下元素
  • 根据属性值使用 xslt 合并两个元素

    这是我的源文件的样子
  • 用于(联合国)结构化文本文档的词法分析器/解析器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有很多脚本解析器和词法分析器 即结构化计算机语言 但我正在寻找一个可以将 几乎 非结构化文本文档分成更
  • 将 transaction.commit_manually() 升级到 Django > 1.6

    我继承了为 Django 1 4 编写的应用程序的一些代码 我们需要更新代码库以使用 Django 1 7 并最终更新到 1 8 作为下一个长期支持版本 在一些地方它使用旧风格 transaction commit manually and
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译

随机推荐