Использование XPath в XMLObject для запроса по пространству имен - PullRequest
0 голосов
/ 14 января 2011

У меня есть простой XML-документ

<abc:MyForm xmlns:abc='http://myform.com'>
    <abc:Forms>
        <def:Form1 xmlns:def='http://decform.com'>
            ....
        </def:Form1>
        <ghi:Form2 xmlns:ghi='http://ghiform.com'>
            ....
        </ghi:Form2>
    </abc:Forms>
</abc:MyForm>

Я использую XMLObjects от Apache, и когда я пытаюсь выполнить следующее выражение xpath, оно отлично работает

object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms/*");

, это дает мне2 узла формы (def и ghi).Однако я хочу иметь возможность запрашивать, указав пространство имен, так что, скажем, я хочу только Form2.Я пробовал это, и это не удается

object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms/*
                      [namespace-uri() = 'http://ghiform.com']");

selectPath возвращает 0 узлов.Кто-нибудь знает, что происходит?

Обновление:

Если я сделаю следующее в 2 этапа, я смогу получить желаемый результат.

 XmlObject forms = object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms")[0];
 forms.selectPath("*[namespace-uri() = 'http://ghiform.com']");

это дает мне узел ghi: Form, как и должно быть, я не понимаю, почему он не делает это как одно выражение XPath.Спасибо

1 Ответ

0 голосов
/ 14 января 2011

Простой ответ: вы не можете.Префикс пространства имен - это просто сокращение для URI пространства имен, и это все, что имеет значение.

Для анализатора с пространством имен ваши два тега идентичны.

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

Но в идеале вы должныПрочитайте учебное пособие о том, как работают пространства имен, и попробуйте использовать их так, как они были спроектированы для использования.

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