JAVA element.getElementsByTagName限制为顶级

use*_*090 20 java xml dom

我有一个XML文件如下:

<rootNode>
    <link>http://rootlink/</link>
    <image>
        <link>http://imagelink/</link>
        <title>This is the title</title>
    </image>
</rootNode>
Run Code Online (Sandbox Code Playgroud)

使用DOM的XML Java代码如下:

NodeList rootNodeList = element.getElementsByTagName("link");
Run Code Online (Sandbox Code Playgroud)

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

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

McD*_*ell 13

你可以使用XPath:

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


ZZ *_*der 11

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

 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;
  }
Run Code Online (Sandbox Code Playgroud)


Ric*_*ler 3

如果你可以使用JDOM来代替,你可以这样做:

element.getChildren("link");
Run Code Online (Sandbox Code Playgroud)

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