【问题标题】:How to find a DOM Node using its attributes如何使用其属性查找 DOM 节点
【发布时间】:2012-10-28 07:13:27
【问题描述】:

我已经使用 JAVA 在编译时将我的 HTML/JSP 解析为 DOM。现在我有了 w3c.dom.Document 对象,假设下面的 HTML

.....
  ....
<input type="text" name="EnterName"/>
<select name="SelectOptions">
<option>First</option>
<option>Second</option>
</select>
 ......
.......

我知道元素的属性值。这里 "EnterName" 是节点 "input" 的 "name" 属性值。

假设我有 DOM 中可用的所有节点的属性值(如上面 HTML 的“EnterName”、“SelectOptions”),我如何才能获得一个节点,其中特定属性可用给定值。谢谢

编辑:

我永远不会知道 HTML 内容是什么。我的程序应该运行 给定 HTML/JSP 文件列表,我有一些元素名称。 这里元素名称是指可用字段的标签/名称 在 HTML/JSP 中。所以我需要遍历所有文件得到 具有相同标签/名称的节点并获取该节点。

【问题讨论】:

    标签: java html parsing dom


    【解决方案1】:

    您可以在 html 中添加自定义属性,例如区分 html 组件

    <input type="text" name="EnterName" myattr1="yes"/>
    <select name="SelectOptions" myattr2="yes">
    <option>First</option>
    <option>Second</option>
    </select>
    

    基于自定义属性,您可以检查和区分 HTML 组件...

    【讨论】:

    • 我不应该更改 HTML。这不在我的控制范围内,谢谢您的回答
    【解决方案2】:

    你可以这样说:

    Element input = .... documene.getElementByTagName("input");
    Attribute eneterName = root.getAttributeNode("EnterName");
    String s = enterName.getXXXValue();
    

    请参考 API 以获得正确的方法来检索值。

    【讨论】:

    • 请检查我的编辑问题并提出建议
    【解决方案3】:

    通常您会按名称搜索属性,例如“名称”,而不是它们的值,例如“输入名字”。所以你通常会去

    String valueForName = myElement.getAttribute("name");
    

    对于任何非常复杂的事情,我都会使用 XPath。哪个适合你想要的。这是一个看起来正是您想要的博客(虽然它不是 Java,但已经足够接近了):

    http://blogs.msdn.com/b/davidklinems/archive/2007/03/13/quick-tip-using-xpath-to-find-nodes-by-attribute-value.aspx

    这是similar non-Java Stack Overflow link

    用Java阐述,有点乏味,但是,大致...

    XPathFactory anXPathfactory = XPathFactory.newInstance();
    XPath xpath = anXPathfactory.newXPath();
    XPathExpression xpe = xpath.compile("your xpath goes here");
    String finallyIGetSomething = (String) xpe.evaluate(node, XPathConstants.STRING);
    

    尚未针对您的情况对此进行测试,因此请谨慎购买

    【讨论】:

    • 请检查我的编辑问题并提出建议
    【解决方案4】:

    试试这样的:

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse("yourDocumentName");
        doc.getDocumentElement().normalize();
        NodeList nlList = doc.getElementsByTagName("input");
        for (int indx= 0; indx < nList.getLength(); indx++) {
           Element eElement = (Element) nList.item(indx);
           if(eElement.getAttribute("name").equals("EnterName")){
                  System.out.println("EnterName: " + eElement.getNodeValue());
           }
        }
    
        NodeList nlList1 = doc.getElementsByTagName("select");
        for (int indx= 0; indx < nList1.getLength(); indx++) {
           Element eElement = (Element) nList1.item(indx);
           if(eElement.getAttribute("name").equals("SelectOptions")){
                  System.out.println("SelectOptions: " + eElement.getNodeValue());
           }
        }
    

    如果您可以将“id”添加到您的元素中,那就容易多了:

     <input type="text" name="EnterName" id="name"/>
     <select name="SelectOptions" id="options">
      ...
    
    
      Element nameElement = doc.getElementbyId("name");
      System.out.println("EnterName: " + nameElement.getNodeValue());
      Element selectElement = doc.getElementbyId("name");
      System.out.println("SelectOptions: " + selectElement.getNodeValue());
    

    【讨论】:

    • 请检查我的编辑问题并提出建议
    • 感谢您的回答。我已经遍历了节点并找到了具有值的适当属性并得到了我想要的
    最近更新 更多