2017-10-06 75 views
1

我有下面的XML文件:查找值匹配另一個節點值

<0> 
    <title>The Little Hours</title> 
    <year>2017</year> 
    <imdbid>tt5666304</imdbid> 
    <scid>10080</scid> 
    </0> 
    <1> 
    <title>CarGo</title> 
    <year>2017</year> 
    <imdbid>tt6680792</imdbid> 
    <scid>10079</scid> 
</1> 
<2> 
    <title>My Little Pony: The Movie</title> 
    <year>2017</year> 
    <imdbid>tt4131800</imdbid> 
    <scid>10078</scid> 
</2> 
<3> 
    <title>Amityville: The Awakening</title> 
    <year>2017</year> 
    <imdbid>tt1935897</imdbid> 
    <scid>10077</scid> 
</3> 
<4> 
    <title>6 Days</title> 
    <year>2017</year> 
    <imdbid>tt4703048</imdbid> 
    <scid>10076</scid> 
</4> 

我希望能夠通過找到<scid>10076</scid>得到值「6日」。

這裏是我迄今爲止...

{xml = new XmlSlurper().parse(folder/'/mov.xml'); 
xml.findAll { [email protected] == fn } 
} 

FN

這隻返回標題爲所有4個節點。如何使用<scid></scid>的值找到<title></title>標籤的值?

+0

請查看解決看看是否有幫助。 – Rao

回答

1

除了小錯誤之外,你幾乎在那裏。 @用於訪問xml元素或節點的attribute;其中,作爲元件可以直接訪問.elementName如下圖所示:下面

使用來實現相同的:

def fn = '10076' 
def xml = new XmlSlurper().parse('/file/path/to.xml') 
//Use findAll if you are expecting multiple titles; this returns a list of all titles matching scid is 10076 
println xml.'**'.findAll { it.name() == 'scid' && it.text() == fn}*.parent()*.title*.text() 

如果你期待scid元素值是唯一的始終,你不需要使用findAll;改用find的方法;所以你總是得到單一的title,而不是像上面的結果。

println xml.'**'.find { it.name() == 'scid' && it.text() == fn}.parent().title.text() 

您可以快速地在線試用demo

+0

@Dade,沒問題。如果這是有幫助的,欣賞投票&[接受爲答案](https://stackoverflow.com/tour)。 – Rao

+0

嘿,對不起,不得不刪除我的評論,因爲我不知道它會通過ENTER按鈕提交。我會用我現在所擁有的東西添加另一條評論。我沒有時間去嘗試它 – Dade

+0

所以我的問題是,我的XML文件非常大,超過47,000多行。因此,我所做的是使用 'def xml = new XmlSlurper()。parse('/ file/path/to.xml')' 來讀取xml文件。然後我用你的代碼 'println xml。'**'。find {it.name()=='scid'&& it.text()== fn} .parent()。title.text()'顯示標題。然而,有一個錯誤/警告這樣說:'表達式產生空值實體名稱必須緊跟在實體引用'&'後 – Dade

相關問題