Проблема с использованием xpath для чтения тегов xhtml - PullRequest
1 голос
/ 02 ноября 2011

Я использую xpath для чтения документа xhtml, я хочу прочитать все элементы внутри тега <p> файла xhtml.Для этого я делаю что-то вроде этого.

XPath xpath = XPathFactory.newInstance().newXPath();                
XPathExpression expr = xpath.compile("//p[2]/*");                 
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println("Nodes>>>>>>>>"+nodes.item(i).getNodeValue());
}

Пример XHMTL выглядит следующим образом ..

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>test</title></head>
    <body>
        <p class="default"> <span style="color: #000000; font-size: 12pt; font-family: sans-serif"> Test Doc</span> </p> 
        <p class="default"> <span style="color: #000000; font-size: 12pt; font-family: sans-serif"> Test Doc1</span> </p>
        <p class="default"> <span style="color: #000000; font-size: 12pt; font-family: sans-serif"> Test Doc2</span> </p>
    </body>
</html>

Но я не могу получить узлы внутри тега <p>, нене может войти в цикл for.

Может кто-нибудь поможет мне в решении этой проблемы.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 02 ноября 2011
       XPathExpression expr = xpath.compile(".//*[local-name()='p'][@id='ur_id']");               

Вы можете это проверить? Я думаю, что это даст вам ваш узел. Будет приятно посетить http://saxon.sourceforge.net/saxon6.5/expressions.html и понять основы XPath при разборе.

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

Вы можете использовать XPathAPI ( javadoc ) для извлечения ваших узлов в виде общего списка Java.

String expr = "//p[2]/*";

Map<String, String> ns = new Map<String, String>;
ns.put("html", "http://www.w3.org/1999/xhtml");

List<String> nodeValues = XPathAPI.html.selectNodeListAsStrings(doc, expr, ns);
for (String nodeValue : nodesValues) {
    System.out.println("Nodes>>>>>>>> " + nodeValue);
}

или

List<String> nodeValues = XPathAPI.html.selectListOfNodes(doc, expr, ns);
for (Node node : nodes) {
    System.out.println("Nodes>>>>>>>> " + node.getTextContent());
}

Отказ от ответственности: я являюсь автором библиотеки XPathAPI.

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

Ваш код пытается напечатать nodeValue s узлов Element, что вряд ли будет тем, что вы хотите.Я ожидаю, что вы хотите nodeValue текстовых узлов.

Другая проблема может быть пространством имен.Похоже, ваш xpath пытается сопоставить элементы p без пространства имен, когда он, вероятно, должен пытаться сопоставить элементы p в пространстве имен http://www.w3.org/1999/xhtml.

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