Как вернуть определенный текст из узла в XML-файл? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь вернуть значения из 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 голосов
/ 13 июня 2019

Не уверен, почему вы используете eval ...

Вы должны быть в состоянии запустить:

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

Возвращать список, содержащий весь текст SourceUrl для любого узла, который устарел как атрибут Описание

...