Невозможно извлечь требуемое значение атрибута из тега с помощью XPath - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть XHTML, как показано ниже:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="sample" content="Just for sample"/>
    <title/>
  </head>
  <body>
    <h1>Sample Heading</h1>
    <p align="left">XHTML and HTML are relatives.<a href="http://www.google.com">Google</a>
    </p>
  </body>
</html>

Я хочу извлечь значение атрибута align из <p>, используя выражение XPath в Java. Итак, я попытался использовать этот код:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);


DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse("TestFile.xhtml");

//Create XPath

XPathFactory xpathfactory = XPathFactory.newInstance();
XPath Inst= xpathfactory.newXPath();
NodeList nodes = (NodeList)Inst.evaluate("//p/@align",doc,XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); ++i) 
   {
            Element e = (Element) nodes.item(i);
            System.out.println(e);
    }

в коде Java. Но я не получаю никакого вывода. Даже если я только напишу //body, ничего не получится. Может кто-нибудь сказать мне, что я здесь делаю не так? Любое изменение в коде будет полезным.

1 Ответ

0 голосов
/ 02 ноября 2018

В вашем 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.

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