如何从XML文件中的节点返回特定文本?

时间:2019-06-13 11:23:45

标签: xml xpath groovy xml-parsing

我正在尝试通过解析文本从XML返回值。 我有一个需要查找特定值的工作,然后在下面的特定元素中返回文本。

但是,当我想从attritube而不是元素中返回文本时,我无法使其正常工作。

在这里您可以看到XML文档的示例:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ADI3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Asset xsi:type="offer:OfferType" uriId="url.com/assetID">
      <offer:BillingId>DUMMY</offer:BillingId>
   </Asset>
   <Asset xsi:type="title:TitleType">
      <core:Description deprecated="true" xmlns:core="urn:cablelabs:md:xsd:core:3.0">Title Package</core:Description>
      <core:Ext xsi:type="ExtType" xmlns:core="urn:cablelabs:md:xsd:core:3.0">
         <TestipediaInfo>
            <test:SeriesInfo xml:lang="en" seasonNumber="2" episodeNumber="9">
               <test:SeriesBrief>A very nice title</test:SeriesBrief>
               <test:EpisodeInfo>
                  <test:SummaryShort>Peter and the crew travel to Greenland.</test:SummaryShort>
               </test:EpisodeInfo>
            </test:SeriesInfo>
         </TestipediaInfo>
      </core:Ext>
   </Asset>
   <Asset xsi:type="offer:OfferType" uriId="url.com/assetID">
      <core:Description deprecated="true" xmlns:core="urn:cablelabs:md:xsd:core:3.0">Series Poster</core:Description>
      <content:SourceUrl>A-typical-file-name_1000x1500.jpg</content:SourceUrl>
   </Asset>
</ADI3>

我使用下面的代码:

File file = new File("stackoverflowtest.xml")

def str = file.text

def xmlSlurper = new XmlSlurper(false,false)
def root = xmlSlurper.parseText(str)
def path = 'Asset."core:Ext".TestipediaInfo."test:SeriesInfo".find{it.@"xml:lang" == "en"}."test:EpisodeInfo"."test:SummaryShort"'
def xpathRes = Eval.x(root, "x.$path")

print(xpathRes)

打印test:SummaryShort中的值

但是,我希望能够做类似的xPath(例如'Asset."core:Ext".TestipediaInfo."test:SeriesInfo".find{it.@"xml:lang" == "en"}."test:EpisodeInfo"."test:SummaryShort"'<content:SourceUrl>包含“系列海报”时从<core:Description deprecated="true" xmlns:core="urn:cablelabs:md:xsd:core:3.0">Series Poster</core:Description>返回文本。

1 个答案:

答案 0 :(得分:0)

不确定为什么要使用eval ...

您应该可以运行:

root.Asset.findAll { it.'core:Description'.@deprecated == 'true' }.'content:SourceUrl'*.text()

要返回一个列表,其中包含已弃用true作为Description属性的任何节点的所有SourceUrl文本