我有一个类似
的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可能很复杂,所以我不想使用正则表达式。
答案 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)