2013-03-27 37 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