簡體   English   中英

無法使用document.getElementById獲取元素,返回null

[英]not able to get an element using the document.getElementById, returning null

我試圖從一個文件中獲取一個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;
}

接下來在我的main方法中,我嘗試通過getElementById將Node對象設置為文檔elemet,如:

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

如果我錯了,請糾正我,但這應該導致節點的恢復。 但是它返回一個空值。 我不明白為什么它沒有返回正確的值。 注意:在調試代碼時,文檔確實包含所有正確的數據,據我所知。

你做錯了。 getElementById的 Javadoc javadoc說:

返回具有給定值的ID屬性的Element。 如果不存在此類元素,則返回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'] - 選擇文檔中具有'header'值的屬性id的所有節點。

您似乎正在使用通用XML DOM。 XML期望ID被定義為這樣,因此具有屬性的元素(即使名為“id”)將不起作用,除非指定為此類。

嘗試查找特定於HTML的界面或添加將ID屬性定義為ID類型的DOCTYPE。 (我不推薦后者,因為HTML5已經遠離嘗試XHTML兼容的方法,即使它在技術上支持XHTML序列化。)請參閱使用JAVA解析網站HTML以獲取有關HTML特定解析器的建議。

嘗試做以下兩件事:

  1. 在buildDocument()函數中,添加以下行:

      Element element = document.getDocumentElement(); 
  2. 將函數的返回類型更改為“Element”並返回“element”

  3. 創建一個“Element”對象而不是“Document”對象,並在其上調用“getElementById()”。
  4. 如果缺少.html擴展名,請檢查文件名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM