我有以下文档:
var person = new Person
{
// populate Person details...
User = new User
{
// populate user details... Don't worry about PersonId...
}
}
dbContext.Persons.Add(person);
dbContext.SaveChanges();
我正在尝试获取dim rng1 as range, rng2 as range
set rng1 = range("b2:c3")
set rng2 = range("a1:d4")
'if rng1 is completely within rng2, the intersection's address will be the same as rng1's address
if application.intersect(rng1, rng2).address = rng1.address then
debug.print rng1.address(0, 0) & " is within " & rng2.address(0, 0)
end if
下的所有列表值;但是,XPath在<html>
<head>
<title>Page</title>
</head>
<body>
<div>
<div>
<div>
</div>
<div class="this one">
<p><span><strong>Ignore</strong></span></p>
<p>Text</p>
<p><span><strong>Header 1</strong></span></p>
<ul><li><span style="color: #000;">List Value 1</span></li></ul>
<p><span><strong>Header 2</strong></span></p>
<ul><li><span style="color: #000;">List Value 2</span></li></ul>
<p><span><strong>Ignore</strong></span></p>
<ul><li><span style="color: #000;">List Value 3</span></li></ul>
<p><span><strong>Header 3</strong></span></p>
<ul>
<li><span style="color: #000;">List Value A</span></li>
<li><span style="color: #000;">List Value B</span></li>
<li><span style="color: #000;">List Value C</span></li>
</ul>
<p><span><strong>Ignore</strong></span></p>
<p>Text</p>
</div>
</div>
</div>
</body>
</html>
这有效:
Header 3
这不是:
<p>
答案 0 :(得分:1)
问题是strong
后面没有兄弟姐妹ul
。
更改
//div[@class='this one']/p/span/strong[text() = 'Header 3']/following-sibling::ul[1]/li/span
到
//div[@class='this one']/p[span='Header 3']/following-sibling::ul[1]/li/span
因为p
在同级之后确实有ul
。然后选择
<span style="color: #000;">List Value A</span>
<span style="color: #000;">List Value B</span>
<span style="color: #000;">List Value C</span>
根据要求。
答案 1 :(得分:0)
问题是您的XPath表达式一直向下爬到<strong>
,它没有任何兄弟姐妹(它是其父<span>
元素的唯一子元素)。紧随其后的<ul>
兄弟元素是<p>
的上一层。
通常,您有两种选择:
先爬下来,然后再备份:
//div[@class='this one']/p/span/strong[text() = 'Header 3']/../../following-sibling::ul/li/span
..
是parent::node()
的简写。
使用预表达:
//div[@class='this one']/p[span/strong[text() = 'Header 3']]/following-sibling::ul/li/span
[
]
中的所有内容都是不移动文档树中当前位置的过滤条件。您可以在其中放置任意XPath表达式。在这里,我们使用它来查找包含p
的{{1}},其中span
包含具有给定文本的strong
。
演示:
function xpath(expr) {
var found = document.evaluate(expr, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var results = [];
for (var i = 0; i < found.snapshotLength; i++) {
results.push(found.snapshotItem(i));
}
return results;
}
console.log(xpath("//div[@class='this one']/p/span/strong[text() = 'Header 3']/../../following-sibling::ul/li/span"));
console.log(xpath("//div[@class='this one']/p[span/strong[text() = 'Header 3']]/following-sibling::ul/li/span"));
<div>
<div>
<div>
</div>
<div class="this one">
<p><span><strong>Ignore</strong></span></p>
<p>Text</p>
<p><span><strong>Header 1</strong></span></p>
<ul><li><span style="color: #000;">List Value 1</span></li></ul>
<p><span><strong>Header 2</strong></span></p>
<ul><li><span style="color: #000;">List Value 2</span></li></ul>
<p><span><strong>Ignore</strong></span></p>
<ul><li><span style="color: #000;">List Value 3</span></li></ul>
<p><span><strong>Header 3</strong></span></p>
<ul>
<li><span style="color: #000;">List Value A</span></li>
<li><span style="color: #000;">List Value B</span></li>
<li><span style="color: #000;">List Value C</span></li>
</ul>
<p><span><strong>Ignore</strong></span></p>
<p>Text</p>
</div>
</div>
</div>