我正在尝试编写一个xpath选择器来提取可能在span
内部或不在<p class='out'>
<span>John</span>
</p>
<p class='out'>
Alice
</p>
<p class='out'>
<span>Tim</span>
</p>
<p class='out'>
Doe
</p>
<p class='out'>
<span>Tina</span>
</p>
<p class='out'>
Joseph
</p>
内的名称,即来自以下两个片段:
//p/span/text()
我能够为个别案例写作,但我如何为两者做这些?
这是我的尝试:
<asp:ModalPopupExtender ID="mdlMessageBox" BackgroundCssClass="modalBackground" runat="server" TargetControlID="hdnField1"
<asp:ImageButton ID="ImageLetterCopy" OnClick="ImageLetterCopy_Click" style="max-width: 100%;max-height: 100%" runat="server" />
答案 0 :(得分:0)
您可以使用OR - &gt; |
运营商以实现您的要求
尝试以下内容: -
//p[not(self::span)] | /span
希望它会对你有所帮助:)。
答案 1 :(得分:0)
你可以使用类似下面的东西,它不是纯粹的XPath解决方案,因为我在结果上应用了一些处理:
XPath.each(xmldoc, "//p/span/text()|//p/text()").map(&:to_s).map(&:strip).reject(&:empty?)
如果可以从输入中删除新行,则可以避免其他处理
xmldoc = Document.new(html.split("\n").join)
XPath.match(xmldoc, "//p/span/text()|//p/text()")
工作样本如下所示:
require 'rexml/document'
include REXML
html = <<-eos
<html>
<p class='out'>
<span>John</span>
</p>
<p class='out'>
Alice
</p>
<p class='out'>
<span>Tim</span>
</p>
<p class='out'>
Doe
</p>
<p class='out'>
<span>Tina</span>
</p>
<p class='out'>
Joseph
</p>
</html>
eos
xmldoc = Document.new(html)
XPath.each(xmldoc, "//p/span/text()|//p/text()").map(&:to_s).map(&:strip).reject(&:empty?)
#=> ["John", "Tim", "Tina", "Alice", "Doe", "Joseph"]
答案 2 :(得分:0)
如果span
并非总是存在,则不要将其用作路标。
我会使用类似的东西:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<p class='out'>
<span>John</span>
</p>
<p class='out'>
Alice
</p>
EOT
doc.search('p.out').map(&:text)
# => ["\nJohn\n", "\nAlice\n"]
如果绝对必须是XPath,那么使用:
doc.search('//p[@class="out"]').map(&:text)
# => ["\nJohn\n", "\nAlice\n"]
除非必须,否则我不使用XPath。 CSS在大多数情况下会产生更多可读选择器,可读性会降低维护。
这是如何运作留给读者的练习。