2009-08-14 22 views
2

我有一个看起来像动态XML过滤和变换(在Java中)

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

我有一个方法

String processBar(String bar) 

一个XML文件,我想

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

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

+1

你真的想让processBar属性值不加引号吗? – 2009-08-14 20:53:41

+0

我想这是不清楚的。如果processBar(“x”) - >“y”,那么我想value =“y”。但我不想要字面字符串“processBar(\”x \“)”,这就是为什么我选择写value =不带引号的原因。 希望这可以让事情更清楚,谢谢你的提问。 – Jacob 2009-08-14 21:02:40

+0

value =“processBar(”bar1“)” - 引号无效,如图所示。 – 2009-08-14 21:28:53

回答

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会很麻烦。

+0

仅供参考我必须修复此错误张贴后。不过,这个想法很有道理。 ;) – 2009-08-14 21:10:47

+0

这看起来不错。你有没有针对语法的文档指针?特别是我想知道什么构造函数用于实例化你的类,等等。 – Jacob 2009-08-14 21:11:25

+0

我在答案中添加了一些信息。 – 2009-08-14 21:18:29

0

你可以分析整个事情在Java的XML解析器或者只是得到的文件内容为一个字符串,然后做一个正则表达式就可以代替(即http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29使用)

+1

继续,提出一个正则表达式来正确解析任何格式正确的XML,并考虑到无限的标记嵌套,CDATA块,字符和外部参考,PI,注释等等。 – 2009-08-14 21:25:00