Я использую ниже xml, чтобы получить количество тегов 'c'.
<?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
Я делаю что-то неправильно?
Если вы хотите подсчитать элементы с локальным именем xyz
, выражение должно быть следующим:
XPathExpression xpr = xpath.compile("count(//*[local-name()='xyz']/*[local-name()='a']/*[local-name()='b']/*[local-name()='c'])");
Не удаляйте значение атрибута пространства имен. Это важно, потому что это фактическое пространство имен.
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)