текстовый узел индекса xpath - PullRequest
0 голосов
/ 21 ноября 2018

Я играю с синтаксисом xpath и застрял на одной проблеме:

Учитывая следующее xml

<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()

который, насколько мне известно, должен выбрать все текстовые узлы, и он делает.

Однако я тогда попытался

//text()[1]

, ожидая, что он выберет первый текстовый узел в XML, которыйдолжен быть текстовым узлом, состоящим из разрыва строки, а затем нескольких пробелов (после открывающего тега корня и до открывающего тега сотрудников), но, к моему удивлению, он вернул это

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'

Как это вообще делаетсмысл?Как он вообще возвратил набор текстовых узлов для начала?

Затем я попытался

(//text())[1]

и он вернул первый текстовый узел xml.Чем это отличается от

//text()[1]


Кстати, я использую два онлайн-теста xpath:

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

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

1 Ответ

0 голосов
/ 21 ноября 2018

//text()[1] возвращает первый текстовый узел каждого элемента.(//text())[1] - возвращает первое вхождение текстового узла в документе

Например, если исходный код

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

//text()[1], должно возвращаться "foo" и "baz" (первый текстузлы каждого a узла), в то время как //text[2] вернет "bar" (второй текстовый узел)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...