Java 中的 XSLT 转换极其缓慢

2024-01-01

我尝试使用 XSLT 转换 XML 文档。作为输入,我有 www.wordpress.org XHTML 源代码,XSLT 是检索站点标题的虚拟示例(实际上它什么也做不了 - 它不会改变任何东西)。

我使用的每个 API 或库,转换大约需要 2 分钟!如果您查看 wordpress.org 源代码,您会发现它只有 183 行代码。正如我在 google 上搜索到的,这可能是由于 DOM 树构建造成的。无论 XSLT 多么简单,它总是需要 2 分钟——因此它证实了它与 DOM 构建相关的想法,但无论如何,我认为它不应该花费 2 分钟。

这是一个示例代码(没什么特别的):

  TransformerFactory tFactory = TransformerFactory.newInstance();
   Transformer transformer = null;

   try {
       transformer = tFactory.newTransformer(
           new StreamSource("/home/pd/XSLT/transf.xslt"));

   } catch (TransformerConfigurationException e) {
       e.printStackTrace();
   }

   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

   System.out.println("START");
   try {
       transformer.transform(new SAXSource(new InputSource(
           new FileInputStream("/home/pd/XSLT/wordpress.xml"))),
           new StreamResult(outputStream));
   } catch (TransformerException e) {       
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
   System.out.println("STOP");

   System.out.println(new String(outputStream.toByteArray()));

在 START 和 STOP 之间,java“暂停”了 2 分钟。如果我查看处理器或内存使用情况,没有任何增加。看起来 JVM 真的停止了......

您是否有转换超过 50 行(这是随机数;))的 XML 的经验?据我了解,XSLT 总是需要构建 DOM 树才能完成其工作。快速转型对我来说至关重要。

提前致谢, 皮奥特尔


示例 HTML 文件是否使用命名空间?如果是这样,您的 XML 解析器可能会尝试从名称空间 URI 检索内容(可能是架构)。如果每次运行正好花费两分钟,则很可能出现这种情况——很可能是一次或多次 TCP 超时。

您可以通过计时实例化所需的时间来验证这一点InputSource对象(实际上解析 WordPress XML 的地方),因为这可能是导致延迟的行。查看您发布的示例文件后,它确实包含声明的命名空间(xmlns="http://www.w3.org/1999/xhtml").

要解决此问题,您可以实施自己的EntityResolver http://download.oracle.com/javase/6/docs/api/org/xml/sax/EntityResolver.html这实际上禁用了基于 URL 的解析。您可能需要使用 DOM —— 请参阅DocumentBuilder's setEntityResolver http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver%28org.xml.sax.EntityResolver%29 method.

这是一个使用 DOM 并禁用分辨率的示例(注意——这是未经测试的):

try {
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbFactory.newDocumentBuilder();
    db.setEntityResolver(new EntityResolver() {

        @Override
        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
            return null; // Never resolve any IDs
        }
    });

    System.out.println("BUILDING DOM");

    Document doc = db.parse(new FileInputStream("/home/pd/XSLT/wordpress.xml"));

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    TransformerFactory tFactory = TransformerFactory.newInstance();
    Transformer transformer = tFactory.newTransformer(
        new StreamSource("/home/pd/XSLT/transf.xslt"));

    System.out.println("RUNNING TRANSFORM");

    transformer.transform(
            new DOMSource(doc.getDocumentElement()),
            new StreamResult(outputStream));

    System.out.println("TRANSFORMED CONTENTS BELOW");
    System.out.println(outputStream.toString());
} catch (Exception e) {
    e.printStackTrace();
}

如果你想使用 SAX,你必须使用SAXSource http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/sax/SAXSource.html#SAXSource%28org.xml.sax.XMLReader,%20org.xml.sax.InputSource%29XMLReader http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html它使用您的自定义解析器。

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

Java 中的 XSLT 转换极其缓慢 的相关文章

  • 将 for 循环转换为 concat String 为 lambda 表达式

    我有以下 for 循环 它迭代字符串列表并将每个单词的第一个字符存储在StringBuilder 我想知道如何将其转换为 lambda 表达式 StringBuilder chars new StringBuilder for String
  • 从java管理unix进程的最佳方法是什么?

    我正在寻找一些简单的任务 例如列出用户的所有正在运行的进程 或者通过pid等杀死特定进程 来自Java的基本unix进程管理 有没有相对成熟且有文档的库 我可以从 JVM 运行外部命令 然后解析标准输出 错误 但这似乎需要大量工作 而且一点
  • Java 1.6 和 Desktop.open() 的问题

    我一直在使用 Destop open 在 Windows 计算机 Vista 和 XP 上启动 pdf 查看器 并且大多数都工作得很好 但是 在一台 XP 计算机上 该调用不起作用 只是返回而不抛出任何异常 并且查看器不会启动 据我所知 在
  • Java错误:线程“main”中出现异常java.lang.ArrayIndexOutOfBoundsException

    我是 Java 初学者 正在学习该课程算法 由普林斯顿大学提供 我按照书上的例子 二分查找在第 9 页 import edu princeton cs algs4 import java util Arrays public class B
  • 我在这个正则表达式中做错了什么?

    我正在做一个关于正则表达式的学校作业 我先解释一下 我必须编写一个正则表达式来检查 URL 我必须检查的条件是 URL 是 http s 还是 ftp s 域名是 nl 还是 edu 至少有一个第三级域名 但如果该域名以 万维网 必须有一个
  • 如何设置鼠标监听器的优先级

    我有一个带有列表和按钮的面板 名单已定MouseAdapter with mouseClick 我添加到面板MouseAdapter with mousePressed and mouseReleased and MouseMotionAd
  • java中接口上的抽象方法是什么[重复]

    这个问题在这里已经有答案了 可能的重复 为什么要将 Java 接口方法声明为抽象方法 https stackoverflow com questions 641536 why would one declare a java interfa
  • SLF4J 日志级别作为参数[重复]

    这个问题在这里已经有答案了 我们希望使用 SLF4J 但我们发现的一件事是您无法将级别指定为参数 即 Logger log Level INFO messsage 你必须这样做 logger info message 这使得无法通过方法传递
  • Web 服务器上的身份验证和授权 ?

    我正在构建一个 Android 应用程序 它与 apache tomcat 上的 Web 服务器进行通信 Web 服务器采用 JAVA EE 构建 目前 为了进行身份验证和授权 我使用用户名 密码 为了管理会话 我使用令牌 因此 当用户登录
  • 使用Optional进行空检查

    我想使用可选实用程序在 JDK8 中执行空检查 这是我正在编写的代码 它给了我一个错误 java util Optional stringToUse java util Optional of childPage getContentRes
  • ViewCompat.setOnApplyWindowInsetsListener使状态栏颜色消失

    这是我用来检测何时的代码Keyboard Height变化 唯一的问题是Statur Bar当此代码运行时 颜色消失并变为白色 ViewCompat setOnApplyWindowInsetsListener this getWindow
  • 查询 XmlDocument 而不会出现“命名空间前缀未定义”问题

    我有一个 Xml 文档 它定义并引用了一些命名空间 我将其加载到 XmlDocument 对象中 据我所知 我创建了一个 XmlNamespaceManager 对象 用于查询 Xpath 问题是我收到命名空间 my 未定义的 XPath
  • hibernate中映射到数据库表的bean的默认继承策略是什么?

    这是我在 stackoverflow 中的第一个查询 我想我正在提供所有必要的输入 我已经提供了我的 Java bean 和数据库表详细信息如下 Java Bean 类 import java sql Timestamp import ja
  • Java 错误:默认构造函数未定义隐式超级构造函数

    我有一些简单的 Java 代码 其结构与此类似 abstract public class BaseClass String someString public BaseClass String someString this someSt
  • 使用 Appengine 进行多线程处理

    既然Appengine不允许java多线程 那么我们如何将现有的多线程代码迁移到该平台呢 例如我有以下代码 Thread t new Thread public boolean alive true public void run whil
  • 如何用java实现FTP?

    我正在使用 FTP 我必须在客户端将消息嵌入到图像文件中 并且我必须将其发送到服务器 在服务器端我必须检索图像文件并然后我将检索该消息 我已经完成了嵌入消息并使用密码学和隐写术技术检索消息 我正在寻找如何将该文件从客户端传输到服务器 我必须
  • 如何处理 Sonarlint java:S2259 (空指针不应取消引用)

    if res getBody null res getBody getServiceResult null return 在上面的代码中 sonarlint 抱怨说 SonarLint 可能会抛出 NullPointerException
  • 我可以在Java中设置枚举起始值吗?

    我使用枚举来创建一些常量 enum ids OPEN CLOSE OPEN 值为零 但我希望它为 100 这可能吗 Java 枚举与 C 或 C 枚举不同 后者实际上只是整数的标签 Java 枚举的实现更像是类 它们甚至可以有多个属性 pu
  • 如何更改 Java 中不同类的变量?

    如何更改 Java 中不同类的变量 我正在尝试更改另一个类中的变量 然后在第一个类中使用它 我在 First 类中创建了一个变量 并将其值设置为 1 然后我尝试在 Second 类中将同一变量的值更改为 2 但是当我在 First 类中使用
  • Java 8 哈希映射无法正常工作

    自 java 8 以来 我们面临着 HashMap 行为方式的奇怪问题 当HashMap的键实现了Comparable接口 但compareTo的实现与equals不一致时 HashMaps 长得比它们应该长的大得多 它们包含多个相同元素的

随机推荐

  • 如何在不并行的情况下提高反向传播 ANN 的性能

    After 剖析我的反向传播算法 我了解到它占用了我 60 的计算时间 在开始研究并行替代方案之前 我想看看是否还有什么可以做的 The activate const double input 函数被分析为只花费约 5 的时间 这gradi
  • 缓存不经常更改的查询结果的最佳技术

    我有一个 php Web 应用程序 其中某些数据每周都会更改 但经常会被频繁读取 检索数据的 SQL 查询和 html 输出的 php 代码相当复杂 有多个表连接和大量计算 但它们会产生一个相当基本的 html 表 用户被分组 每周每个组的
  • 挪威 CultureInfo 遇到麻烦

    我目前正在我的应用程序中处理全球化问题 其中一部分是与 CultureInfo 和 RegionInfo 一起使用 有一个问题确实让我很困惑 也许有人可以对此进行一些说明 var ci1 new CultureInfo de Correct
  • WebService / java.net.SocketTimeoutException:读取超时

    我在 WebService 中面临一个问题 详细信息如下 Caused by org apache cxf interceptor Fault Could not send Message at org apache cxf interce
  • 如何从joomla中的模块参数获取数据

    我正在构建 joomla 2 5 模块 我想从模块参数访问数据传递 但出现以下错误 致命错误 在非对象上调用成员函数 get 我的代码如下 帮助程序 php class modFeedGrabber function feedurl par
  • 迭代数据库结果时,如何在应用程序引擎(python)中收集内存垃圾

    我有一些迭代数据库实体的代码 并在任务中运行 见下文 在应用程序引擎上我得到Exceeded soft private memory limit错误 并且确实检查memory usage current 确认了问题 请参阅下面的日志记录语句
  • Android NDK:对“stderr”的未定义引用

    我想在 Android 应用程序中使用 ASI SDK 预构建的二进制文件 我在 Windows 10 上使用 Android Studio 2 1 3 以及 gradle 实验插件 和 Android NDK r12b 我调用基本 SDK
  • Gitlab 持续集成 npm 后台进程

    我有一个 gitlab ci 设置 我想在其中启动本地 npm 服务器以在后台进行测试 我的 gitlab ci yml就好像 stages setup build test cache paths venv node modules se
  • IOS 我可以在 appDelegate 上使用 AVAudioPlayer 吗?

    我有一个TabBarController有两个选项卡 我想在两个选项卡上播放音乐 现在我的代码在主目录上appDelegate NSURL url NSURL fileURLWithPath NSBundle mainBundle path
  • 关于dispatch_semaphore_dispose的EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

    我在dispatch semaphore dispose 上收到 EXC BAD INSTRUCTION code EXC I386 INVOP subcode 0x0 但真的不知道如何找到其根本原因 我的代码使用了dispatch asy
  • Hadoop 任务跟踪器问题

    这是一个奇怪的问题 当我的笔记本电脑断电并自行关闭时 我正在运行 MR 作业 单节点 由于ubuntu 10 04中缺少 无电池 警告 当我再次启动并尝试启动hadoop 单节点 时 一切顺利 当我从命令行发出 jps 时 会列出所有主进程
  • 将消息从其他语言发送到 IPython 内核

    有人有从 Python 外部与 IPython 内核通信的经验吗 如果我尝试将消息从 Python 应用程序发送到 IPython 内核 我会使用zmq kernelmanager https github com ipython ipyt
  • Java Servlet Filter 重定向问题

    我的身份验证过滤器有问题 当过滤器重定向到登录页面时 登录 JSP 中不会显示任何图像 但是 如果我在登录后手动进入登录页面 则会显示图像 我不明白为什么会这样 我很感激任何帮助 验证过滤器 if authorized null path
  • MySql 两个时间戳之间的差异(以天为单位)?

    如何获得两个时间戳之间的天数差异 我应该为此使用日期时间列吗 I switched my column to datetime Simple subtraction doesn t seem to give me a result in d
  • Python OpenCv 如何检测视频何时播放完毕?

    我正在使用 Python 3 5 和 Opencv 制作交互式视频 但是我不知道如何检测我的视频何时播放完毕 有什么想法可以检测视频何时结束吗 非常感谢 当ret为False时 表示视频处于最后一帧 这是我的代码 你可以试试 import
  • javascript 问题:返回 false 不起作用

    嘿 我的程序中有一个链接 如图所示 onclick 它调用函数clearform 如下所示 网页代码 a class button href Cancel Cancel a JavaScript 代码 function clearForm
  • docker selenium/standalone-chrome 无法连接到 docker web 服务器

    我正在尝试使用 codeception 来运行使用 docker 容器开发的 php 网站的测试 我在 Web 容器中创建了一个测试文件夹并将 codecept phar 放在那里 这是项目的设置 docker compose yml ve
  • Spring Boot应用程序中的双日志文件

    我有一个名为 service1 的 Spring Boot 应用程序 它使用以下属性文件层次结构来配置日志 bootstrap yml 有 spring application name service1 application yml 有
  • MySQL 触发器为新行设置值并更新同一表中的另一行

    我有一个表格来跟踪特定项目的费用 这些费用可能会随着时间的推移而变化 因此我有两列 startDate endDate 当前的费用集始终在遥远的将来有一个 endDate 我已经有一个触发器 用于对输入的新行进行一些计算 但我还希望发生的是
  • Java 中的 XSLT 转换极其缓慢

    我尝试使用 XSLT 转换 XML 文档 作为输入 我有 www wordpress org XHTML 源代码 XSLT 是检索站点标题的虚拟示例 实际上它什么也做不了 它不会改变任何东西 我使用的每个 API 或库 转换大约需要 2 分