2013-03-27 59 views
1

考慮這個XML文件結構獲得屬性,其中子標記都有屬性X

... 
<sometag attr="foobar"> 
    <subtag> 
     <subsubtag someattr="foo" /> 
     <subsubtag someattr="bla" /> 
     <subsubtag someattr="bar" /> 
    </subtag> 
</sometag> 
... 

目前,我有這個XPath查詢:/sometag/subtag/subsubtag[@someattr='foo']這讓我這些subsubtags。是否有可能從這個查詢中獲得attr="foobar"?所以我想擁有所有attrsometag哪裏有subsubtagsomeattr="foo"

回答

1

上的XML文件:

<root> 
<sometag attr="foobar1"> 
    <subtag> 
    <subsubtag someattr="foo"/> 
    <subsubtag someattr="bla"/> 
    <subsubtag someattr="bar"/> 
    </subtag> 
</sometag> 
<sometag attr="foobar2"> 
    <subtag> 
    <subsubtag someattr="foo"/> 
    <subsubtag someattr="bla"/> 
    <subsubtag someattr="bar"/> 
    </subtag> 
</sometag> 
<sometag attr="foobar3"> 
    <subtag> 
     <subsubtag someattr="f2342oo" /> 
     <subsubtag someattr="bla" /> 
     <subsubtag someattr="bar" /> 
    </subtag> 
</sometag> 
</root> 

嘗試:

/root/sometag/subtag/subsubtag[@someattr='foo']/../../@attr 

我上here做了一個快速測試,它似乎是爲我工作。

+0

爲什麼答案是首先被刪除? stackoverflow錯誤? – reox 2013-03-27 10:41:52

+0

不,我第一次犯了一個錯誤,我選擇了整個'sometag'元素,不僅是@attr;在寫完整的答案之前,我必須做一些測試,並且我不希望我的不好的答案在此期間可見。 – ionutab 2013-03-27 15:16:07

+0

奇怪...因爲我想接受它,然後我收到一條錯誤消息「答案已被刪除」... – reox 2013-03-28 10:00:30

2

另一種可能性我只是發現:

/sometag/subtag/subsubtag[@someattr='foo']/../../@attr 

可以使用..選擇父節點。你需要上hirachie並選擇屬性。

1
/sometag[subtag/subsubtag[@someattr="foobar"]]/@attr 

以下嚴格:

// sometag [// subsubtag [@ someattr = 「foobar的」]]/@ ATTR

+0

你能說如果這種方法會比另一種更快嗎? XPath編譯器有沒有區別,還是將其減少到相同的AST? – reox 2013-03-28 10:01:47

+0

第一種方法會比第二種方法更快(在大多數情況下,這取決於特定的XPath引擎),因爲在第二種方法中,某些XPath引擎會遍歷更多節點以查找標籤。 你必須使用第一或第二嗎?這取決於。如果它是HTML樹,那麼我會使用第二個,因爲每次HTML佈局更改時我都不想更改XPath表達式。如果它是XML文檔,那麼我會堅持第一種方法。 – 2013-03-28 11:04:17