动态xml过滤和转换(用Java)

时间:2009-08-14 20:49:20

标签: java xml xslt

我有一个类似

的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可能很复杂,所以我不想使用正则表达式。

2 个答案:

答案 0 :(得分:4)

假设您的意思是使用在所述属性值上调用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:变量中,如下所示:

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

或者某些人。

这只适用于Xalan,但由于这是与JDK一起发布的XSLT处理器,我怀疑使用Xalan会很繁琐。

答案 1 :(得分:0)

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