2014-01-25 21 views
3

我想从稍后将用于计算其所有后代的文件中获取html节点。我在从DOM中检索元素时遇到问题。这是我迄今采取的步骤。无法使用document.getElementById获取元素,返回null

首先这里是我的html代码:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
<div id="container"> 
    <a></a> 
    <div id="header"> 
     <div id="firstchild"> 
      <div> 
       <img></img> 
      </div> 
      <a></a> 
      <ul> 
       <li> 
        <a>Inbox</a> 
       </li> 
       <li> 
        <a>Logout</a> 
       </li> 
      </ul> 
      <form></form> 
     </div> 
     <div id="nextsibling"></div> 
    </div> 
</div> 
</body> 
</html> 

其次,我建立了这个功能,将返回并解析文件插入到文档中。

public static Document buildDocument(String file){ 
    try { 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document document = docBuilder.parse(file); 
     return document; 
    } catch (ParserConfigurationException | SAXException | IOException ex) { 
     System.out.println("the exception is: " + ex.toString()); 
    } 
    return null; 
} 

下一页在我的主要方法我试过一个Node对象设置为一样的getElementById的方式elemet文件:

public Document doc = buildDocument("myHTMLFile"); 
org.w3c.dom.Node node = doc.getElementById("header");//the id of an html element 

纠正我,如果我错了,但是这将导致的retreival节点。但是它返回一个空值。我不明白为什么它没有返回正确的值。注意:在调试代码时,文档确实包含了所有正确的数据,据我所知。

+0

你可以给'catch'增加一个更通用的异常吗? (我不是一个Java的人,顺便说一句) –

+0

另外,你传递“myHTMLFile”?我认为它有一个扩展或'parse'方法需要获取其内容而不是将其解释为字符串? –

+0

我不认为这个错误是在构建文档函数中,当我遍历程序时,我能够查看文档并可以看到其中的所有元素。看起来,当getElementById被调用时,它无法找到该id,但我知道它在那里,所以我为什么没有找到它是一个损失。 –

回答

9

你做错了。 Javadoc javadoc of getElementById说:

返回具有给定值的ID属性的元素。如果不存在这样的元素,则返回null。 ... DOM实现应该使用属性Attr.isId来确定属性是否为ID类型。 注:名称为“ID”或“id”的属性不属于类型ID,除非这样定义。

在您的情况最好的解决办法是使用XPath(简单的查询语言XML):

XPath xpath = XPathFactory.newInstance().newXPath(); 
Node node = (Node) xpath.evaluate("//*[@id='header']", document, XPathConstants.NODE); 

表达// * [@ ID = '标题'] - 选择所有节点具有“标题”值的属性标识的文档。

+0

谢谢你的工作很棒!一旦我能够得到元素,我的代码的其余部分完美工作。 –

+0

哇,这个api是如此愚蠢..很明显,属性id是每个人都认为是id的意思...... – Vistritium

0

尝试做以下两件事情:

  1. 在你buildDocument()函数,添加以下行:

    Element element = document.getDocumentElement(); 
    
  2. 改变返回类型的函数来 “元素” 和返回“元素”

  3. 创建一个“Element”对象而不是“Document”对象并在其上调用“getElementById()”。
  4. 还要检查该文件的名称,如果你缺少.html扩展
2

您似乎在与通用的XML DOM工作。 XML期望ID被定义为这样,因此具有属性的元素(即使名为“id”)将不起作用,除非被指定为这样。

尝试找到一个HTML特定的接口或添加一个定义id属性作为ID类型的DOCTYPE。 (我不会推荐后者,因为即使HTML5技术上支持XHTML序列化,HTML5已经不再尝试XHTML兼容方法。)有关HTML特定解析器的建议,请参阅Parse Web Site HTML with JAVA

相关问题