Как найти все текстовые узлы в документе XML с пространством имен, используя XPath? - PullRequest
1 голос
/ 21 февраля 2012

Предположим, у меня есть этот XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://www.foo.com">
    <foo:one>Alpha</foo:one>
    <two foo:Dog="Yorkie">Bravo</two>
    <three>foo:Delta</three>
</root>

Если я хочу использовать XPath для поиска всех элементов, которые находятся в пространстве имен «http://www.foo.com"» (например, элемент «один»), я могу использовать это:

//*[namespace-uri()='http://www.foo.com']

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

//@*[namespace-uri()='http://www.foo.com']

Если я хочу найти все элементы с текстовым узлом в этом пространстве имен (например, элемент «три»), какой XPath я могу использовать?

XPath 1 или 2 допускается. Спасибо.

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Если я хочу найти все элементы с текстовым узлом в этом пространстве имен (например, элемент «три»), какой XPath я могу использовать?

Толькоузлы, которые имеют имя, могут находиться в пространстве имен .

Таким образом : текстовые узлы, комментарии и узлы документов не имеют (принадлежат) пространству имен.

Имя PI также не принадлежит ни к какому пространству имен.

Следовательно, нет ничего похожего на "текстовый узел в этом пространстве имен" ...

В этом конкретном случае вы можете выбрать требуемые элементы, используя это выражение XPath :

//*[text()[starts-with(., 'foo:')]]

. При этом выбирается любой элемент в документе XML, у которого есть хотя бы один дочерний элемент текстового узла, чье строковое значениеначинается со строки "foo:".

1 голос
/ 21 февраля 2012

В текстовом узле нет такой вещи как пространство имен;Ваш three узел просто содержит текст foo:Delta, который не имеет специального значения в XML.Вы можете найти узлы, содержащие текст, начинающийся с foo:, используя starts-with:

//*[starts-with(., "foo:")]
...