【问题标题】:Dynamic xml filtering and transform (in Java)动态 xml 过滤和转换(在 Java 中)
【发布时间】:2009-08-14 20:49:20
【问题描述】:

我有一个看起来像这样的 XML 文件

<?xml version='1.0' encoding='UTF-8'?>
   <root>
      <node name="foo1" value="bar1" />
      <node name="foo2" value="bar2" />
   </root>

我有一个方法

String processBar(String bar)

我想结束

<?xml version='1.0' encoding='UTF-8'?>
   <root>
      <node name="foo1" value="processBar("bar1")" />
      <node name="foo2" value="processBar("bar2")" />
   </root>

有没有简单的方法来做到这一点?最好用Java。请注意,该文件太大而无法安全地完全加载到内存中。 XML中的数据大致随意,processBar可能比较复杂,所以不想用正则表达式。

【问题讨论】:

  • 您真的希望 processBar 属性值不被引用吗?
  • 我想这还不清楚。如果 processBar("x") --> "y",那么我想要 value="y"。但我不想要文字字符串“processBar(\"x\")”,这就是我选择不带引号编写 value= 的原因。希望这能让事情更清楚,谢谢你的提问。
  • value="processBar("bar1")" - 如图所示,引号无效。

标签: java xml xslt


【解决方案1】:

假设您的意思是用对所述属性值调用 processBar 的结果替换属性值...

使用 JDK 的 XSLT API 运行以下命令:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:java="http://xml.apache.org/xalan/java"
                extension-element-prefixes="java">
  <xsl:template match="/root/node/@value">
    <xsl:attribute name="value">
      <xsl:value-of select="java:com.example.yourclass.processBar(string(.))"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

这使用Xalan-Java 扩展并采用静态方法。您可以获取对象的实例并将其存储在 xsl:variable 中,如下所示:

<xsl:variable name="frobber" select="java:com.example.Frobber.new()"/>
<xsl:value-of select="java:processBar($frobber, string(.))"/>

或者类似的。

这仅适用于 Xalan,但由于这是随 JDK 分发的 XSLT 处理器,我怀疑使用 Xalan 会很麻烦。

【讨论】:

  • 仅供参考,我必须在发布后修复其中的一些错误。不过,这个想法是合理的。 ;)
  • 这看起来很棒。您对 语法的文档有任何指示吗?特别是我想知道使用什么构造函数来实例化你的类等。
  • "请注意,文件太大,无法安全地完全加载到内存中" - Xalan 不会在处理之前将输入文件完全加载到内存中吗?流式 XSLT 扩展仅在 XSLT 2.1 中提供...
  • 公平地说,史蒂文,最初的问题没有说明文档的复杂性,也没有正确的 XML 引号,这就是为什么正则表达式可能是一个可行的解决方案。 (也就是说,XSL 转换器可能无法在没有引号的情况下写入不带引号的值。)
  • @Thangalin:这就是为什么我忽略了书面问题并按预期回答了它。 ;) 如果您将输入的内容称为“XML”,而将输出的内容称为“XML”,那么正则表达式并不是真正可行的解决方案。
【解决方案2】:

您可以在 java xml 解析器中解析整个内容,或者只需将文件内容转换为字符串,然后对其进行正则表达式替换(使用 http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29

【讨论】:

  • 来吧,想出一个正则表达式来正确解析任何格式良好的 XML,同时考虑到无限制的标签嵌套、CDATA 块、字符和外部引用、PI、cmets 等...
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2013-04-07
  • 2011-06-15
  • 1970-01-01
  • 2013-05-29
  • 2021-12-20
  • 2016-05-30
相关资源
最近更新 更多