XPath Как получить значение ячейки таблицы из html-документа

У меня есть html-документ, и где-то внутри документа находится под таблицей, я могу получить строки таблицы и объекты java DOM. Что мне непонятно, так это то, как извлечь значение ячейки таблицы, когда значение является строкой, а также когда это двоичный ресурс?

Я использую такой код:

  XPath xpath;
   XPathExpression expr;
   NodeList nodes=null;
   // Use XPath to obtain whatever you want from the (X)HTML
   try{

      xpath = XPathFactory.newInstance().newXPath();
      //<table class="data">

      NodeList list = doc.getElementsByTagName("table");
     // Node node = list.item(0); 
     //System.out.println(node.getTextContent());
    //String textContent=node.getTextContent();

    expr = xpath.compile("//table/tr/td");
    nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);

и повторяться как:

     for (int i = 0; i < nodes.getLength(); i++) {

       Node ln = list.item(i);
       String lnText=ln.toString();
       NodeList rowElements=ln.getChildNodes();
       Node one=rowElements.item(0);

       String oneText=one.toString();
       String nodeName=one.getNodeName();
       String valOne = one.getNodeValue();

Но я не вижу значений в таблице.

 <table class="data">
 <tr><td>ImageName1</td><td width="50"></td><td><img src="/images/036000291452" alt="036000291452" /></td></tr>
 <tr><td>ImageName2</td><td width="50"></td><td><img src="/images/36000291452" alt="36000291452" /></td></tr>
 <tr><td>Description</td><td></td><td>Time Magazine</td></tr>
 <tr><td>Size/Weight</td><td></td><td>14 Issues</td></tr>
 <tr><td>Issuing Country</td><td></td><td>United States</td></tr>
  </table>

person Androider    schedule 09.05.2011    source источник
comment
Хороший вопрос, +1. См. мой ответ для полного краткого и простого однострочного решения XPath для этой проблемы.   -  person Dimitre Novatchev    schedule 09.05.2011


Ответы (2)


Это выражение XPath:

/*/tr[1]/td[1]

выбирает элемент td (без пространства имен), который является первым дочерним элементом первого дочернего элемента tr верхнего элемента (table) предоставленного XML-документа.

Выражение XPath:

/*/tr[1]/td[2]

выбирает элемент td (без пространства имен), который является вторым дочерним элементом первого дочернего элемента tr верхнего элемента (table) предоставленного XML-документа.

В целом:

/*/tr[$m]/td[$n]

выбирает элемент td (без пространства имен), который является $n-м дочерним элементом $m-го tr дочернего элемента верхнего элемента (table) предоставленного XML-документа. Просто замените $m и $n нужными целочисленными значениями.

Вы можете использовать стандартную функцию XPath string(), чтобы получить их строковое значение:

string(/*/tr[$m]/td[$n])

оценивается как строковое значение элемента td (без пространства имен), который является $n-м дочерним элементом $m-го tr дочернего элемента верхнего элемента (table) предоставленного XML-документа.

person Dimitre Novatchev    schedule 09.05.2011
comment
Теперь с точки зрения выполнения этого выражения я использую Java API. Итак, я выполняю следующее: - person Androider; 09.05.2011
comment
XPathExpression exp = xpath.compile(string(/*/tr[3]/td[1])); String val =(String) exp.evaluate(doc, XPathConstants.STRING); - person Androider; 09.05.2011
comment
Но я не возвращаю строковое значение. Не могли бы вы прокомментировать выполнение этого выражения. - person Androider; 09.05.2011
comment
XPathExpression exp = xpath.compile(string(//*/tr[3]/td[1])); Node val =(Node) exp.evaluate(doc, XPathConstants.NODE); возвращает значение, но обратите внимание на дополнительный /, и это не строковое значение. - person Androider; 09.05.2011
comment
@Androider: я не программист на Java, вам нужно читать, практиковать примеры и понимать эти API. Кроме того, (отсутствие) результатов, которые вы получаете, вполне объяснимо, если документ находится в пространстве имен по умолчанию. Вы никогда не показывали полный XML-документ. Я ожидал, что документ может находиться в пространстве имен по умолчанию, поэтому я всегда говорю, что выбирает элемент td (без пространства имен), потому что, если есть пространство имен по умолчанию, ни одно из этих выражений ничего не выбирает. Пожалуйста, представьте (отредактируйте свой вопрос) полный (как можно меньший) XML-документ. - person Dimitre Novatchev; 09.05.2011

Используйте путь типа «string(//td)», чтобы получить строковое содержимое каждой ячейки. Для связанных ресурсов вам нужно будет использовать что-то вроде «//td/img/@src», чтобы получить URL-адреса, затем канонизировать их относительно исходного URL-адреса и получить полученный URL-адрес из сети.

person Tassos Bassoukos    schedule 09.05.2011
comment
в порядке. Как именно можно применить этот xpath к таблице. Допустим, я Описание: Журнал Time. - person Androider; 09.05.2011
comment
Я имею в виду, что мой путь дает мне ряд тд. Но когда я получаю tds, значение td не является текстовым значением, которое можно распечатать. getTextValue getContentValue не возвращает значения. Как вы индексируете ячейки, используя строку (//td), спасибо - person Androider; 09.05.2011
comment
string(//td) на самом деле не помогает получить их по индексу. Я привел точную таблицу. Мне нужно увидеть индексируемый способ сделать это. - person Androider; 09.05.2011
comment
XPath Как получить значение ячейки таблицы из html-документа - person Androider; 09.05.2011