В вашем XHTML нет элемента с именем p
, хотя он может выглядеть так.
Когда вы используете атрибут xmlns
в XML, вы заявляете, что элемент, содержащий этот атрибут, и все элементы-потомки находятся в этом пространстве имен (если явно не переопределены другими объявлениями пространства имен).
Итак, корневой элемент не назван html
, это фактически «html» в пространстве имен «http://www.w3.org/1999/xhtml"». Часть html
называется «локальной частью». Локальное имя и URI пространства имен вместе известны как QName .
По соглашению это записывается путем помещения URI пространства имен в фигурные скобки в качестве префикса, поэтому для обсуждения корневым элементом является {http://www.w3.org/1999/xhtml}html
, а искомый элемент - {http://www.w3.org/1999/xhtml}p
.
Один из способов справиться с этим - установить NamespaceContext , но по причинам, которые по-прежнему ускользают от меня, в Java SE нет общедоступной стандартной реализации NamespaceContext, что делает его рутинной работой.
Более простой подход - настроить выражение XPath для поиска элементов на основе только локальной части каждого элемента:
Inst.evaluate("//*[local-name()='p']/@align", doc, XPathConstants.NODESET);
Если вы используете DocumentBuilderFactory , не забудьте вызвать setNamespaceAware (true) для него перед созданием DocumentBuilder.