Почему метод getChild () JDOM возвращает ноль? - PullRequest
3 голосов
/ 10 марта 2011

Я делаю проект, касающийся манипулирования HTML-документами. Я хочу, чтобы содержимое тела из существующего HTML-документа преобразовывало его в новый html. Теперь я использую JDOM. я хочу использовать элемент body в моей кодировке. Для этого я использовал getChild ("body") в моей кодировке. Но он возвращает ноль в мою программу. Но в моем html-документе есть элемент body. Может ли кто-нибудь помочь мне узнать эту проблему как я студент?

будет признателен за указатели ..

Coding:

import org.jdom.Document;
import org.jdom.Element;
public static void getBody() {
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser", true);
org.jdom.Document jdomDocument=builder.build("http://www......com");
Element root = jdomDocument.getRootElement();
      //It returns null
System.out.println(root.getChild("body"));
}

пожалуйста, обратитесь к ним тоже. Мой html-корень и дочерние элементы напечатаны в консоли ...

root.getName():html

SIZE:2

[Element: <head [Namespace: http://www.w3.org/1999/xhtml]/>]

[Element: <body [Namespace: http://www.w3.org/1999/xhtml]/>]

Ответы [ 3 ]

8 голосов
/ 10 марта 2011

Я обнаружил некоторые проблемы в вашем коде: 1) если вы хотите создать удаленный XML через сеть, вы должны использовать другой метод сборки, который получает URL-адрес в качестве входных данных.На самом деле вы анализируете файл с именем "www ...... com" как xml.

Document jdomDocument = builder.build( new URL("http://www........com"));

2) если вы хотите проанализировать html-страницу как xml, вы должны проверить, чтоэто правильно сформированный документ xhtml, иначе вы не сможете разобрать его как xml

3), как я уже сказал вам в другом ответе, root.getChild("body") возвращает дочернего элемента root, имя которого "body",без пространства имен.Вы должны проверить пространство имен для элемента, который вы ищете;если у него есть определенное пространство имен, вы должны передать его следующим образом:

root.getChild("body", Namespace.getNamespace("your_namespace_uri"));

Чтобы узнать, какое пространство имен имеет ваш элемент простым способом, вы должны распечатать все дочерние элементы root, используя метод getChildren:

for (Object element : doc.getRootElement().getChildren()) {
    System.out.println(element.toString());
}

Если вы пытаетесь разобрать xhtml, возможно, у вас есть пространство имен uri http://www.w3.org/1999/xhtml.Так что вы должны сделать это:

root.getChild("body", Namespace.getNamespace("http://www.w3.org/1999/xhtml"));
2 голосов
/ 10 марта 2011

Что заставляет вас чувствовать, что вам нужен org.ccil.cowan.tagsoup.Parser?Что это дает вам, чего нет у встроенного в JDK парсера?

Я бы попробовал использовать другой конструктор для SAXBuilder.Используйте синтаксический анализатор, встроенный в JDK, и посмотрите, поможет ли это.

Начните с распечатки всего дерева, используя XMLOutputter .

public static void getBody() 
{
    SAXBuilder builder = new SAXBuilder(true);
    Document document = builder.build("http://www......com");
    XMLOutputter outputter = new XMLOutputter();
    outputter.output(document, System.out);  // do something w/ exception
}
1 голос
/ 10 марта 2011
import org.jdom.Document;
import org.jdom.Element;
public static void getBody() {
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser", true);
org.jdom.Document jdomDocument=builder.build("http://www......com");
Element root = jdomDocument.getRootElement();
      //It returns null
System.out.println(root.getChild("body", Namespace.getNamespace("my_name_space")));
}
...