为什么JDOM的getChild()方法返回null?

时间:2011-03-10 12:00:38

标签: java html xml jdom

我正在做一个关于html文档操作的项目。我希望现有的html文档中的正文内容将其修改为新的html。现在我正在使用JDOM。我想在我的编码中使用body元素。因为我在编码中使用了getChild(“body”)。但它将null返回给我的program.But我的html文档有一个body元素。可以有人帮我知道这个问题我是学生?

会很感激指点..

编码:

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和childs打印在控制台......

root.getName():html

SIZE:2

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

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

3 个答案:

答案 0 :(得分:8)

我在你的代码中发现了一些问题: 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"));

要知道哪个命名空间有一个简单的元素,你应该使用getChildren方法打印出所有root的子节点:

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"));

答案 1 :(得分:2)

是什么让你觉得你需要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
}

答案 2 :(得分:1)

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")));
}