2013-11-19 1 views
0

У меня есть XML, как показано ниже:доступа JDOM элементы независимо от пространства имен

<v2:Root xmlns:v2="www.example.com/xsd/"> 
<ABC>test data</ABC> 
<ABC>test data1</ABC> 
<ABC>test data2</ABC> 
</v2:Root> 

Когда я доступ к ABC элемент с помощью JDOM2, я получаю значение элемента в отлаживать как

[Element:ABC[Namespace:"www.example.com/xsd/"]]. 

Вот почему я не смог получить доступ к элементу, просто используя выражение Xpath "//ABC". Я вынужден использовать выражение "/*[local-name()='ABC']". Затем он работает.

Теперь мое требование заключается в доступе к элементу, используя выражение "//ABC". Там в любом случае?

Заранее благодарим за любую помощь.

ответ

0

Я думаю, вы ошибаетесь в отношении того, как выглядит ваш XML. Я считаю, что вы также должны иметь:

xmlns="www.example.com/xsd/" 

там где-то в противном случае ваши ABC элементы будут находиться в NO_NAMESPACE пространстве имен (и метод ABC ToString() будет выглядеть следующим образом: [Element:ABC])

Итак, ваш XML-фрагмент не соответствует результату toString() ABC Element.

Если вы исправите свой вопрос, будет легче предложить, как должно выглядеть ваше выражение XPath.


EDIT, предполагая, что я прав, что у вас есть дополнительное переопределение пространство имен по умолчанию, то вы можете использовать следующую JDOM, чтобы получить ABC элементы:

XPathFactory xpf = XPathFactory.instance(); 
Namespace defns = Namespace.getNamespace("defns", "www.example.com/xsd/"); 
XPathExpression<Element> xpe = xpf.compile("//defns:ABC", Filters.element(), null, defns); 
List<Element> abcs = xpe.evaluate(doc); 

Вы должны прочитать следующий отрывок from the XPath specification:

QName в тесте узла расширено в расширенное имя, используя объявления пространства имен из контекста выражения. Точно так же выполняется расширение для имен типов элементов в начальных и конечных тегах, за исключением того, что пространство имен по умолчанию, объявленное с помощью xmlns, не используется: если QName не имеет префикса, тогда URI пространства имен имеет значение NULL (это то же самое имена атрибутов пути). Это ошибка, если в QName есть префикс, для которого нет объявления пространства имен в контексте выражения.