在Groovy / Java中解析WXS项目文件

时间:2015-09-07 16:22:56

标签: xml groovy wix

我尝试从基于Groovy的构建脚本中解析项目版本信息,该脚本来自版本定义为.wxs宏的三方WIX项目文件:

<?define ProductVersion = '5.0.00' ?>
...
<Product Name="My Product" Version='$(var.ProductVersion)' .... >
...
显然,这样的伎俩:

def productVersion =  new XmlSlurper().parse(wxsFile).Product.first().attributes().Version

只会返回$(var.ProductVersion)

是否有可以预处理WIX XML代码以扩展宏的Groovy / Java解析器? 或者,也许,有一种方法可以遍历<?define>部分(作为一种解决方法,这样做)?

2 个答案:

答案 0 :(得分:0)

我无法代表Groovy / Java,但在C#Linq到XML世界中,我得到的是XProcessingInstruction的后代节点,并寻找在ProductVersion上匹配的节点。

但是在WiX中,预处理器变量也可以传递到构建中或者分解到其他源中。例如,在Team Foundation Server构建中,TFS设置一个名为TF_BUILD_NUMBER的环境变量。在我的MSBuild(.wixproj)中,我对此进行RegEx匹配并将其分配给msbuild属性。然后我将属性分配给预处理器变量,最后我在你看到的Product元素中使用变量。

所以我想在我能给你更具体的指导之前,我想知道你在做什么。然后,如何在Groovy / Java中实现它是我的经验之外的。我确定它与我们在C#中所做的类似。

答案 1 :(得分:0)

这不是一个完整的解决方案,但如果你找不到更好的解决方案,你应该提供一个提示。

解析声明

 import groovy.util.Eval 
 def  var = [:]

 // <?define ProductVersion = '5.0.00' ?>
 // for each define transform to this assignment ...
 var.ProductVersion  = '5.0.00'

解析属性

像往常一样解析,但替换为卷曲括号并将可变名称设置为 x

 def wxsFile = '<Product Name="My Product" Version="$(var.ProductVersion)" />'  
 def productVersion =  new XmlSlurper().parseText(wxsFile).first().attributes().Version.replaceAll(/\(var\./, "{x.").replaceAll(/\)/, "}")

这给出了一个字符串 $ {x.ProductVersion}

<强>评估

使用 Eval.x ,您可以传递daclaration变量(在 var hashmap中定义)并评估引用这些变量的字符串。可变名称​​ x 是硬编码的,这是重命名的原因。

 def expr =  "return \"${productVersion}\""
 println expr
 //  return "${x.ProductVersion}"

 println Eval.x(var, expr)
 //  5.0.00