根据其他孩子选择父母的子女

时间:2016-03-16 15:33:06

标签: c# xpath html-agility-pack

使用HTMLAgilityPack我试图根据以下结构使用FindElementsByXPath函数生成可点击对象列表。

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

问题是,如果表的style-attribute设置为“display:None;”,我只想包含最深层的a-tag。 (请注意,如果表已经展开,则样式属性不存在。)

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

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

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

2 个答案:

答案 0 :(得分:0)

解决方案

以下查询应该有效:

//*[@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>

然后返回

<a>Txt</a>

注释

您的查询基本上是正确的。请注意以下内容。

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

答案 1 :(得分:0)

我从工作中回来并重新看到它后找到了答案。事实证明,如果你没有点击a-tag中包含的文本,表格根本就不是&#34;那里&#34;就XML而言。只有在你点击它之后,它才会在萤火虫中显现出来,其独特的风格等于&#34;显示:无;&#34;或者是空的。对于我的应用程序,我因此必须检查表是否存在,如果没有,请单击a-tag。最终的XPath是:

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

信用确实必须去Ezra指出XPath的细微差别!