根据其他 child 选择 children of parent

Selecting children of parent, based on other child

我正在尝试使用 HTMLAgilityPack 生成可点击列表 objects,使用函数 FindElementsByXPath,基于以下结构。

<div class = "table-container">
    <div>  
            <strong>
                <a>Txt<a/>
            </strong>
    </div>
    <Table class="sc" style="display: None;">  
    </Table>
</div>

但是问题是,如果 table 的 style-attribute 设置为 "display: None;",我只想包含 deepest-level a-tag(请注意如果 table 已经展开,则样式属性不存在)。

我正在尝试生成一个 XPath 表达式来帮助我实现此目的。到目前为止,我已经做到了:

//*[@class='table-container' and table[contains(@style,'display: None;')]]/div/strong/a

但是,这不起作用。我尝试在线搜索解决方案并尝试各种设置,但到目前为止运气不佳。我是 XPath 选择器的新手,发现自己卡在了这一刻。任何帮助将不胜感激。

解决方案

以下查询应该有效:

//*[@class='table-container' and Table[contains(@style,'display: None;')]]/div/strong/a

这与您所拥有的非常接近。

测试

我在以下 Xml 上测试了它:

<?xml version="1.0" encoding="UTF-8"?>

<root> 
  <div class="table-container"> 
    <div> 
      <strong> 
        <a>Txt</a> 
      </strong> 
    </div>  
    <Table class="sc" style="display: None;"/> 
  </div>  
  <div class="table-container"> 
    <div> 
      <strong> 
        <a>Txt2</a> 
      </strong> 
    </div>  
    <Table class="sc"/> 
  </div> 
</root>

它returns

<a>Txt</a>

备注

您的查询基本正确。请注意以下事项。

  1. Xml 解析器可能真的很挑剔。检查选择器中项目的大小写。例如,table 可能不匹配,但 Table 可能匹配。
  2. Xml 解析器可能真的很脆弱。检查您尝试解析的标记是否有效。在发布的片段中,我们有 <a>Txt<a/> 导致我的解析器呕吐。一旦我将其更改为 <a>Txt</a> 就可以了。
  3. 做同一件事往往有很多不同的方法。最合适的将在很大程度上取决于您实际的结构Xml。例如,//div[Table[@style='display: None;']]//a 在测试数据上运行良好,但“在现实生活中”可能不起作用。例如,如果您实际使用的 Xml 在 display:Nonedisplay: None 之间变化(冒号后有 space),这会导致另一个问题。

下班回来重新看的时候找到了答案。事实证明,如果您没有单击 a 标签中包含的文本,就 XML 而言,table 根本就不是 "there"。只有在您单击它之后,它才会在 firebug 中可见,并且区分样式等于 "display: None;" 或为空。因此,对于我的应用程序,我必须检查 table 是否存在,如果不存在,请单击 a-tag。最终的 XPath 是:

//*[@class='table-container' and not(Table)]/div/strong/a

Ezra 指出了 XPath 的细微差别,这一定要归功于他!