Проблем с използването на xpath за четене на xhtml таговете

Използвам 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.

Може ли някой да ми помогне в разрешаването на този проблем.

Благодаря предварително


person user972590    schedule 02.11.2011    source източник
comment
Аз съм нов в това, можете ли да дадете подробен отговор   -  person user972590    schedule 02.11.2011
comment
Моля, добавете към въпроса си примерен XHTML - пълен файл, включително html тага - който бихте очаквали да работи, но не работи.   -  person Alohci    schedule 02.11.2011
comment
Ако използвате пространствата от имена, това може да е причината да не можете да получите достъп до етикета. За това можете да прецизирате вашия xpath израз да бъде като .//*[local-name()='p']. Това ще върне възлите, без да отчита пространство от имена.   -  person Kris    schedule 02.11.2011
comment
@Alohci, редактирах въпроса си, като добавих примерен xhtml файл, моля, погледнете   -  person user972590    schedule 02.11.2011
comment
@Krishnanunni, сега мога да получа стойностите на възела, използвайки локалното име, благодаря за отделеното време. Ако имам няколко параграфа и искам да осъществя достъп до конкретен абзац въз основа на да кажем някакъв идентификатор, как мога да се справя?   -  person user972590    schedule 02.11.2011
comment
Публикувах отговор. Опитай.   -  person Kris    schedule 02.11.2011


Отговори (3)


       XPathExpression expr = xpath.compile(".//*[local-name()='p'][@id='ur_id']");               

Можете ли да проверите това? Мисля, че това ще ви осигури вашия възел. Ще бъде хубаво да посетите http://saxon.sourceforge.net/saxon6.5/expressions.html и разбиране на основите на XPath при анализиране.

person Kris    schedule 02.11.2011
comment
//XXX[@attrib='abc'] ще избере възела с атрибут attrib='abc' - person Kris; 02.11.2011

Вашият код се опитва да отпечата nodeValues възли на Element, което е малко вероятно да е това, което искате. Очаквам, че искате nodeValue текстови възли.

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

person Alohci    schedule 02.11.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);
}

or

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

Отказ от отговорност: Аз съм автор на библиотеката XPathAPI.

person gioele    schedule 02.11.2011