2014-11-26 3 views
1

Я использую ниже xml, чтобы получить счетчик тегов 'c'.Функция счетчика XPath всегда возвращает 0.0

<?xml version='1.0' encoding='UTF-8'?> 
<xyz xmlns="....."> 
<a> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
    <b> 
    <c>X:1 Y:0</c> 
    <c>X:2 Y:0</c> 
    </b> 
</a> 
</xyz> 

Ниже мой Java-код:

xpath = factory.newXPath(); 
xpr = xpath.compile("count(//xyz/a/b/c)"); 
System.out.println(xpr.evaluate(inputSource, XPathConstants.NUMBER)); 

Но приведенный выше код всегда возвращает 0.0

Я делаю что-то не так?

+0

Для начала, ваш XPath не принимая во внимание пространства имен. – kjhughes

+0

Но я просто попробовал свой прецедент здесь. Http://www.freeformatter.com/xpath-tester.html#ad-output дал мне результат как 5.0 –

+0

@peeppeep Как вы создаете источник ввода? XPath не кажется проблематичным. – manouti

ответ

2

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

XPathExpression xpr = xpath.compile("count(//*[local-name()='xyz']/*[local-name()='a']/*[local-name()='b']/*[local-name()='c'])"); 

Demo.

+0

Это все еще возвращает 0.0 –

+0

@peeppeep Оказалось, что тот же трюк должен применяться к остальным трем уровням (см. Редактирование и демонстрацию). – dasblinkenlight

1

Не удаляйте значение атрибута пространства имен. Это важно, потому что это фактическое пространство имен.

A xmlns="urn:somevalue" определяет пространство имен по умолчанию для элементов. A <xyz xmlns="urn:somevalue"/> или <ns1:xyz xmlns:ns1="urn:somevalue"/> могут считываться как имя узла {urn:somevalue}:xyz.

XPath 1.0 не имеет пространства имен по умолчанию. Вы всегда должны использовать префикс для узлов в пространстве имен.

Так что, если вы определяете префикс ns1 в пространстве имен распознавателя для вашего XPath выражения будет:

count(//ns1:xyz/ns1:a/ns1:b/ns1:c) 
Смежные вопросы