我在玩xpath语法,陷入一个问题:
给出以下xml
class VertexC: Vertex {
string colour;
string getColour() {
return colour;
}
}
class GraphC: Graph {
void doSomething(string colour) {
for(auto &v: vertices) {
if(v->getColour() == "red") // Do something...
}
}
}
我第一次尝试过
<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<employees>
<employee id="1">
<name>
Johnny Dapp
<br />
<br />
</name>
</employee>
<employee id="2"><name>Al Pacino</name></employee>
<employee id="3"><name>Robert De Niro</name></employee>
<employee id="4"><name>Kevin Spacey</name></employee>
<employee id="5"><name>Denzel Washington</name></employee>
<notanemployee id="14"><name>HELLO WORLD</name></notanemployee>
</employees>
<foo:companies>
<foo:company id="6">Tata Consultancy Services</foo:company>
<foo:company id="7">Wipro</foo:company>
<foo:company id="8">Infosys</foo:company>
<foo:company id="9">Microsoft</foo:company>
<foo:company id="10">IBM</foo:company>
<foo:company id="11">Apple</foo:company>
<foo:company id="12">Oracle</foo:company>
<bar:company id="13">Google</bar:company>
</foo:companies>
</root>
据我所知,应该选择所有文本节点,并且确实如此。
但是我后来尝试了
//text()
期望它将选择xml中的第一个文本节点,该文本节点应该是由换行符和一些空白组成的文本节点(在根开头标签之后和员工开头标签之前),但令我惊讶的是它返回了
//text()[1]
那怎么办呢?它甚至如何返回一组文本节点开始?
然后我尝试
Text='
Johnny Dapp
'
Text='Al Pacino'
Text='Robert De Niro'
Text='Kevin Spacey'
Text='Denzel Washington'
Text='HELLO WORLD'
Text='
'
Text='Tata Consultancy Services'
Text='Wipro'
Text='Infosys'
Text='Microsoft'
Text='IBM'
Text='Apple'
Text='Oracle'
Text='Google'
,它确实返回了xml的第一个文本节点。与
有什么不同(//text())[1]
顺便说一句,我正在使用两个在线xpath测试器:
答案 0 :(得分:1)
//text()[1]
返回每个元素的第一个文本节点。 (//text())[1]
-返回文档中文本节点的首次出现
例如,如果源代码是
<a>
foo
<br>
bar
</a>
<a>
baz
</a>
//text()[1]
应该返回"foo"
和"baz"
(每个a
节点的第一个文本节点),而//text[2]
将返回"bar"
(第二个文本节点)