【问题标题】:Xpath for choosing next sibling用于选择下一个兄弟的 Xpath
【发布时间】:2010-01-19 09:08:03
【问题描述】:

我有一段这样的 HTML:

名称
名称2
值2

我想找出所有结构不正确的地方,即dt标签后面没有dd标签。

我试过这个:

//dt/following-sibling::dt

但这不起作用。有什么建议吗?

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    EDIT 如@Gaim 所述,我的原始版本未能捕获终端dt

    string xml = @"
        <root>
        <dt>name</dt>
        <dd>value</dd>
        <dt>name2</dt>
        <dt>name3</dt>
        <dd>value3</dd>
        <dt>name4</dt>
        <dt>name5</dt>
        <dd>value5</dd>
        <dt>name6</dt>
        </root>
        ";
    
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    
    XmlNodeList nodes = 
        doc.SelectNodes("//dt[not(following-sibling::*[1][self::dd])]");
    
    foreach (XmlNode node in nodes)
    {
        Console.WriteLine(node.OuterXml);
    }
    
    Console.ReadLine();
    

    输出是那些没有dd 紧跟其后的dt 节点:

    <dt>name2</dt>
    <dt>name4</dt>
    <dt>name6</dt>
    

    我们在这里做的是说:

    //dt
    

    所有dt 节点,任何地方......

    [not(following-sibling::*[1]
    

    ....这样不是他们的第一个后续兄弟姐妹(不管它叫什么)....

    [self::dd]]
    

    ...被称为dd

    【讨论】:

    • +1 -- XPath 表达式可以分解为//dt[following-sibling::*[1][self::dt]]
    • @Tomalak 你的 XPath 并不匹配所有情况,看看我的回答,你只匹配第一个。
    • @Gaim:你是对的。 not() 方法是正确的,我没有想到 &lt;dt&gt; 是最后一个兄弟的情况。
    • 知道如何在
      丢失时处理,例如label1 value1
      label2value2
      ...... ?
    【解决方案2】:

    我不确定我是否理解你,但我有我的解决方案。此 XPath 匹配 ALL &lt;dt&gt; 后面没有直接跟 &lt;dd&gt;。所以有测试结构

    <xml>
      <dt>name</dt> <!-- match -->
    
      <dt>name2</dt>
      <dd>value2</dd>
    
      <dt>name</dt>
      <dd>value</dd>
    
      <dt>name2</dt>  <!-- match -->
    </xml>
    

    有XPath

    //dt[ name( following-sibling::*[1] ) != 'dd' ]
    

    //dt[  not( following-sibling::*[1]/self::dd ) ]
    

    他们做同样的事情

    【讨论】:

    • +1 比我原来的好,它未能捕获终端 dd-lacking dt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多