2011-10-31 66 views
0

我希望有这可能需要2个或多个参数类似inputfind_tag一个常规功能。常规XML解析功能

我写的东西像下面的测试(没有的功能),但它并没有给我D_1164898448。请帮助我。

def temp="""<Portals objVersion=\"1.1.19\"> 
<vector xsi:type=\"domainservice:Portals\" objVersion=\"1.1.19\"> 
<domainName>D_1164898448</domainName> 
<address xsi:type=\"metadata:NodeRef\" objVersion=\"1.1.19\"> 
<host>Komodo</host> 
<port>18442</port> 
</address> 
</vector> 
</Portals>""" 

def fInput="domainName" 

def records = new XmlParser().parseText(temp) 
def t=records.findAll{ it.fInput}.text() 
println t 

更新

的属性我正在干什么类似下面

​​

但像明智如何做到这一点的节点?

println "host = ${records.vector.address.host.text()}" 

回答

2

如果你不知道你正在寻找,你可以做这样的事情让所有标签的给定名称的内容的XML标签的准确路径:

def t = records."**"."$fInput".text() 

要从给定的XML节点访问属性也可以使用@符号,例如

[email protected] 
1

你需要做的是:

  • 关闭名称空间意识,使XmlParser的不会在遇到绑定xsi:前缀抛出一个错误。您可以通过将正确的参数传递给XmlParser构造函数来完成。
  • 正确遍历由分析器返回的DOM树 - 它返回一个Node,而不是一个列表,并使用findAll你使用的方式是行不通的
  • (可选)从你的XML双引号之前删除反斜杠,作为逃避双一个定界符引号内是没有必要的

你的更正后的代码:

def temp=""" 
    <Portals objVersion="1.1.19"> 
     <vector xsi:type="domainservice:Portals" objVersion="1.1.19"> 
      <domainName>D_1164898448</domainName> 
      <address xsi:type="metadata:NodeRef" objVersion="1.1.19"> 
       <host>Komodo</host> 
       <port>18442</port> 
      </address> 
     </vector> 
    </Portals> 
""" 

def fInput="domainName" 

def records= new XmlParser(false, false).parseText(temp) 
def t = records.vector."$fInput".text() 
println t 

运行它会显示 'D_1164898448',符合市场预期。

+0

有什么类似'$ {records.attribute(“ID”)}“'拿到节点,其中代替'id'我可以给我的完整DOM树路径节点? – abi1964

+0

的XmlReader返回'groovy.util.Node',这是不一样的DOM节点,所以不支持XPath表达式它能做什么支持是GPATH表述,这里所描述:http://groovy.codehaus.org/GPath。看看你能不能用这个如果没有,你需要充分的XPath支持,你可能需要使用一个外部库;看到http://groovy.codehaus.org/Reading+XML+with+Groovy+and+XPath – socha23

0

我想你一定在这里使用XPath表达式,或者如果你输入的XML excactly你有问题表明,我是正则表达式推荐给你喜欢

def temp = ".." //your temp 

def m = temp =~ /<domainName>(.*)</domainName>/ 
print m[0][1] // should be your domain 

更多关于Groovy的正则表达式http://groovy.codehaus.org/Regular+Expressions

+0

如何'(*)'解析?当我使用'调用println堂妹 “<$fInput>(。*)”'它只是给了我'(。*)' – abi1964

+0

对不起,我是想你熟悉Groovy Regexp。编辑更多解释。 –

+1

@AlexeySviridov你建议使用Regexp解析XML?真? –