【问题标题】:not able to get an element using the document.getElementById, returning null无法使用 document.getElementById 获取元素,返回 null
【发布时间】:2014-02-16 21:50:08
【问题描述】:

我正在尝试从一个文件中获取一个 html 节点,该文件稍后将用于计算其所有后代。我在从 DOM 中检索元素时遇到问题。这是我到目前为止所采取的步骤。

首先是我的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;
}

接下来在我的主要方法中,我尝试通过 getElementById 将 Node 对象设置为文档元素,例如:

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

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

【问题讨论】:

  • 您能否向catch 添加更通用的异常? (顺便说一句,我不是 Java 人)
  • 另外,您正在传递“myHTMLFile”?我假设它有一个扩展名或parse 方法需要获取其内容而不是将其解释为字符串的任何内容?
  • 我不认为错误出在构建文档功能中,当我逐步执行程序时,我能够查看文档并可以看到其中的所有元素。似乎当 getElementById 被调用时它无法找到 id 但我知道它在那里,所以我不知道为什么它没有找到它。
  • @brett,是的,这是扩展名,我为这个问题存根。

标签: java javascript html parsing dom


【解决方案1】:

看来您正在使用通用 XML DOM。 XML 需要这样定义 ID,因此具有属性的元素,即使命名为“id”,除非这样指定,否则将无法工作。

尝试查找特定于 HTML 的界面或添加将 id 属性定义为 ID 类型的 DOCTYPE。 (我不推荐后者,因为 HTML5 已经不再尝试兼容 XHTML 的方法,即使它在技术上支持 XHTML 序列化。)请参阅Parse Web Site HTML with JAVA 以获取有关 HTML 特定解析器的建议。

【讨论】:

    【解决方案2】:

    你做错了。 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='header'] - 选择文档中属性 id 为 'header' 值的所有节点。

    【讨论】:

    • 谢谢你做得很好!!!一旦我能够获得该元素,我的其余代码就会完美运行。
    • 哇,这个api好傻。。很明显,属性id就是每个人都说的id。。。
    【解决方案3】:

    尝试做以下两件事:

    1. 在您的 buildDocument() 函数中,添加以下行:

        Element element = document.getDocumentElement();
      
    2. 将函数的返回类型改为“元素”,返回“元素”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多