JAVA element.getElementsByTagName限制为顶级

时间:2009-08-06 21:15:58

标签: java xml dom

我有一个XML文件如下:

<rootNode>
    <link>http://rootlink/</link>
    <image>
        <link>http://imagelink/</link>
        <title>This is the title</title>
    </image>
</rootNode>

使用DOM的XML Java代码如下:

NodeList rootNodeList = element.getElementsByTagName("link");

这将为我提供所有“链接”元素,包括顶层和“图像”节点内的元素。

有没有办法让rootNode的“链接”标签在一个级别而不是两个,例如图像链接的情况?也就是说,我只想要http://rootlink/“链接”。

5 个答案:

答案 0 :(得分:13)

您可以使用XPath

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
NodeList links = (NodeList) xpath.evaluate("rootNode/link", element,
    XPathConstants.NODESET);

答案 1 :(得分:10)

我找不到任何方法来做这个,所以我写了这个辅助函数,

 public static List<Element> getChildrenByTagName(Element parent, String name) {
    List<Element> nodeList = new ArrayList<Element>();
    for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
      if (child.getNodeType() == Node.ELEMENT_NODE && 
          name.equals(child.getNodeName())) {
        nodeList.add((Element) child);
      }
    }

    return nodeList;
  }

答案 2 :(得分:3)

如果您可以使用JDOM,则可以执行此操作:

element.getChildren("link");

使用标准Dom,您可以获得的最接近的是迭代子节点列表(通过调用getChildNodes()并检查NodeList的每个项目(i),选择具有匹配名称的节点。

答案 3 :(得分:1)

我知道这是一个老问题,但是我还有一个替代方案可以添加。

这不是最有效的,但有效:

使用getElementsByTagName获取所有孩子,然后检查每个孩子与你开始的孩子有相同的父母。

我使用这个是因为我有一组结果,每个结果都可以嵌套在里面。当我调用我的Result构造函数时,我需要添加任何嵌套的结果,但是因为他们自己会查找自己的子级,所以我不想将子级添加到当前级别(他们的父级将添加它们)。

示例:

NodeList children = resultNode.getElementsByTagName("result");
for(int i = 0; i<children.getLength(); i++){
   // make sure not to pick up grandchildren.
   if(children.item(i).getParentNode().isSameNode(resultNode)){
        addChildResult(new Result((Element)children.item(i)));
    }
}

希望这有帮助。

答案 4 :(得分:0)

我写了这个函数来通过tagName获取节点值,限制到顶级

public static String getValue(Element item, String tagToGet, String parentTagName) {
    NodeList n = item.getElementsByTagName(tagToGet);
    Node nodeToGet = null;
    for (int i = 0; i<n.getLength(); i++) {
        if (n.item(i).getParentNode().getNodeName().equalsIgnoreCase(parentTagName)) {
            nodeToGet = n.item(i);
        }
    }
    return getElementValue(nodeToGet);
}

public final static String getElementValue(Node elem) {
    Node child;
    if (elem != null) {
        if (elem.hasChildNodes()) {
            for (child = elem.getFirstChild(); child != null; child = child
                    .getNextSibling()) {
                if (child.getNodeType() == Node.TEXT_NODE) {
                    return child.getNodeValue();
                }
            }
        }
    }
    return "";
}