从 XML 构建树结构的速度很慢

2024-05-10

我正在将 XML 文档解析为我自己的结构,但对于大型输入来说构建它非常慢,是否有更好的方法来做到这一点?

public static DomTree<String> createTreeInstance(String path) 
  throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    File f = new File(path);
    Document doc = db.parse(f);       
    Node node = doc.getDocumentElement(); 
    DomTree<String> tree = new DomTree<String>(node);
    return tree;
}

这是我的 DomTree 构造函数:

    /**
     * Recursively builds a tree structure from a DOM object.
     * @param root
     */
    public DomTree(Node root){      
        node = root;        
        NodeList children = root.getChildNodes();
        DomTree<String> child = null;
        for(int i = 0; i < children.getLength(); i++){  
            child = new DomTree<String>(children.item(i));
            if (children.item(i).getNodeType() != Node.TEXT_NODE){
                super.children.add(child);
            }
        }
    }

UPDATE:

我使用 100MB XML 文件对 createTreeInstance() 方法进行了基准测试:

  • 创建 docBuilderFactory...完成 [3ms]
  • 创建 docBuilder...完成 [21ms]
  • 正在解析文件...完成 [5646ms]
  • getDocumentElement...完成 [1ms]
  • 创建 DomTree...完成 [17076ms]

UPDATE:

正如 John Doe 在下面建议的那样,使用 SAX 可能更合适 - 我以前从未使用过 SAX,那么有没有一个好的方法可以将我必须的内容转换为使用 SAX?


如果您要解析大型 XML,则不会使用 DOM,而是使用 SAX、拉式解析器(例如 XPP3 或其他任何解析器)。

问题是内存中不会有一个可能很方便的“XML 树”,您只能获取事件并相应地处理它们。然而,这将是内存明智的,并且您可以将元素映射到数据结构。

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

从 XML 构建树结构的速度很慢 的相关文章

  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用非 ASCII(自然语言)XML 标签是否合适?

    使用以非 ASCII 自然语言编写的 XML 标签 元素名称 是否合适 XML 规范允许这样做 请参阅Names http www w3 org TR 2006 REC xml11 20060816 NT Name and 例外情况 htt
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 如何下载内存流文件

    我是 asp net 的初学者 我使用以下命令创建 pdf 文件PdfRpt http pdfreport codeplex com SourceControl BrowseLatest 我在课堂上写这段代码 namespace PdfRe
  • 自动将变量名称添加到列表的元素[重复]

    这个问题在这里已经有答案了 我有一个模型列表 为了使代码更易于维护 因此可以方便地添加和删除模型 我希望有一个地方来存储它们及其名称 为此 我必须解决以下命名问题 上游 我生成模型的方式比以下方式效率低 如果是这样压缩的 我会assign他
  • 从安全角度来看,在 Windows 中使用管道是否被认为是危险的?

    从安全角度来看 在 Windows 中使用管道是否被认为是危险的 管道在 Windows 中并不是一个特殊的安全风险 如果您担心安全性 请确保将管道上的安全描述符设置为适当的 DACL 如果您的使用要求管道开放供任何人连接 那么您必须将传入
  • Flutter:删除按钮中的填充 - FlatButton、ElevatedButton、OutlinedButton

    我希望删除 FlatButton 的默认边距 但似乎无法设置 覆盖它 Column children
  • jQuery 仅定位父 div 中的元素

    我的页面上有许多小部件 我想在整个页面中重复使用类 我有一个问号图标 应该在小部件内的 2 个 div 之间切换可见性 问题是我无法让我的代码仅针对当前小部件 我已经尝试过常用的技术 但似乎没有一个在这里起作用 小提琴在这里 http js
  • ASP.NET MVC - 授权属性登录重定向后保留 POST 数据

    我有一个带有评论的博客文章页面 任何用户 无论是否登录 都可以在页面底部看到一个表单来发表评论 当用户输入评论且未获得授权时 用户将被重定向到登录 注册页面 登录后 用户将被重定向回操作 但包含评论正文的 POST 数据会丢失 我使用 AS
  • iPhone中的异步for循环

    for循环看起来像这样 我在视图中编写的确实加载了 因此加载此页面需要更多时间 for int i 3 i lt dataDict objectForKey rss objectForKey channel objectForKey ite
  • Devise/CanCanCan - 允许管理员创建新用户

    我正在使用 Rails 4 0 2 设计并康康康 https github com CanCanCommunity cancancan 我正在尝试允许管理员创建新用户 管理员用户在用户表中分配有一个布尔字段 在ability rb中我有以下
  • PHP - SQLite 与 SQLite3

    我已经使用 SQLite 2 8 17 制作了一个 Web 应用程序 我现在才发现有一个 SQLite3 在制作 Web 应用程序时 它以某种方式逃避了我的注意 可能是由于缺少 php 函数的文档 我想知道 使用 SQLite3 比 SQL
  • Scrapy:在调用之间保存cookie

    有没有办法在 scrapy 爬虫的调用之间保留 cookie 目的 网站需要登录 然后通过 cookie 维持会话 我宁愿重复使用会话 也不愿每次都重新登录 请参阅有关 cookie 的文档 常见问题解答入口 http doc scrapy
  • Node.js 解析路由的最小函数

    我有一个 Node js Express 应用程序正在运行 它接收如下路由 app get resource res someFunction app get foo bar id someOtherFunction 这很棒并且工作正常 我
  • Swift 为 .toInt 提供Optional(3) 而不是 3

    尝试从字段中提取数字并继续获取可选 数字 而不是数字 IBOutlet weak var years UITextField IBAction func calculateYear sender AnyObject var a years
  • 在 Android 上缩小时,Skobbler 注释会从地图中消失

    目前 我正在向地图视图添加注释列表 代码类似于以下内容 Add to map view SKAnnotation annotation new SKAnnotation i annotation getLocation setLongitu
  • Azure ARM 模板、站点的 VNET 集成

    我正在 Azure 云中管理整个系统的创建 是否可以在模板内设置站点资源 Web 应用程序或功能 的 VNET 集成 附上我要管理的设置的屏幕截图 是否可以在模板内设置站点资源 Web 应用程序或功能 的 VNET 集成 以下模板可用于创建
  • “@inject”-ed 属性保持为空

    我试图将服务注入到我的 bean 中 但它总是null 我收到以下错误 WELD 001000 根据基本 null 解析属性 userBean 时出错 一些代码片段 索引 xhtml
  • css伪类最后一个子问题

    我在使用时遇到问题 last child伪选择器 我有以下标记 div class apply container div
  • 状态存储在 Fluxor 中的哪里?

    我是与状态管理人员合作的新手 目前 我正在开发 blazor 应用程序 我偶然发现了 fluxor 框架 它允许通过 Flux 模式进行状态管理 Fluxor 对我来说工作得很好 但是我似乎无法弄清楚页面状态的实际存储位置 它是在缓存 数据
  • 防止浏览器弹出警告窗口

    我正在尝试在新窗口中打开 jsp 页面 使用 JavaScriptwindow open产生浏览器警告 并且在某些情况下 firefox 将默认阻止弹出窗口 有没有办法解决这个问题 这不是恶意应用程序 它是内部用户工具 大多数浏览器不会阻止
  • 在浏览器中覆盖 TAB

    如果我在输入字段中输入文本并按ENTER我所知道的所有浏览器的默认行为是提交表单 但是如果我按ENTER在文本区域内添加新行 每当我按下时 有什么方法可以模仿这种行为 缩进 而不是提交表单 TAB在文本区域内 Bespin https be
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree