2010-03-26 110 views
1

我有一个看起来像这样的xml文档。用xpath匹配第一组元素

<foo> 
    <bar type="artist"/> Bob Marley </bar> 
    <bar type="artist"/> Peter Tosh </bar> 
    <bar type="artist"/> Marlon Wayans </bar> 
</foo> 
<foo> 
    <bar type="artist"/> Bob Marley </bar> 
    <bar type="artist"/> Peter Tosh </bar> 
    <bar type="artist"/> Marlon Wayans </bar> 
</foo> 
<foo> 
    <bar type="artist"/> Bob Marley </bar> 
    <bar type="artist"/> Peter Tosh </bar> 
    <bar type="artist"/> Marlon Wayans </bar> 
</foo> 

我想构建一个只返回第一组的XPath:

<bar type="artist"/> Bob Marley </a> 
<bar type="artist"/> Peter Tosh </a> 
<bar type="artist"/> Marlon Wayans </a> 

一个怎么会去吗?我尝试过//bar[@type='artist'],但很明显,还有更多。提前致谢。

+0

对于例如您的意思是否与关闭标签或为那只是一个错字? – 2010-03-26 18:06:54

+0

啊...对不起,这是一个错字。 :) – 2010-03-26 18:18:43

回答

2

为了得到一些“索引”节点的唯一子元素:

//foo[1]/bar[@type='artist'] 

〔实施例在C#:

string xml = 
    @"<root> 
     <foo> 
      <bar type='artist'> Artist 1 </bar> 
      <bar type='artist'> Artist 2 </bar> 
      <bar type='artist'> Artist 3 </bar> 
     </foo> 
     <foo> 
      <bar type='artist'> Artist 1 </bar> 
      <bar type='artist'> Artist 2 </bar> 
      <bar type='artist'> Artist 3 </bar> 
      <bar type='artist'> Artist 4 </bar> 
     </foo> 
    </root>"; 
XmlDocument document = new XmlDocument(); 
document.LoadXml(xml); 

Assert.That(document.SelectNodes(@"/root/foo[1]/bar[@type='artist']").Count, 
           Is.EqualTo(3)); 
Assert.That(document.SelectNodes(@"//foo[1]/bar[@type='artist']").Count, 
           Is.EqualTo(3)); 
+0

谢谢伊丽莎。这看起来接近我所需要的。稍后会尝试。顺便说一句,我正在与pythons lxml工作,所以将不得不适应这一点。 – 2010-03-26 18:20:02