xpath索引文本节点

时间:2018-11-20 21:31:19

标签: xml xpath

我在玩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测试器:

https://www.freeformatter.com/xpath-tester.html#ad-output

https://www.webtoolkitonline.com/xml-xpath-tester.html?

1 个答案:

答案 0 :(得分:1)

//text()[1]返回每个元素的第一个文本节点。 (//text())[1]-返回文档中文本节点的首次出现

例如,如果源代码是

<a>
  foo
  <br>
  bar
</a>
<a>
  baz
</a>

//text()[1]应该返回"foo""baz"(每个a节点的第一个文本节点),而//text[2]将返回"bar"(第二个文本节点)