java - 如何使用DOM选择具有不同标签的节点?

标签 java xml dom domparser

我有一个 xml 文件,如下所示:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
 <HWData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NE MOID="WBTS-42" NEType="WBTS">
   <EQHO MOID="EQHO-1-0" >
     <UNIT MOID="UNIT-FAN-1" State="enabled"></UNIT>
     <UNIT MOID="UNIT-FAN-3" State="enabled"></UNIT>
   </EQHO>
  </NE>
  <NE MOID="RNC-40" NEType="RNC">
   <EQHO MOID="EQHO-3-0" >
     <UNIT MOID="UNIT-FAN-5" State="disabled"></UNIT>
     <UNIT MOID="UNIT-FAN-6" State="disabled"></UNIT>
   </EQHO>
  </NE>
</HWData>

我问如何使用 DOM 获取包含“NE”和“UNIT”标签的 NodeList? 谢谢

最佳答案

您可以手动完成:

import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XmlDomTest {
    public static void main(String[] args) throws Exception {
        File file = new File("/path/to/your/file");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder(); 
        Document doc = db.parse(file);
        Set<String> filteredNames = new HashSet<String>(Arrays.asList("NE", "UNIT"));
        NodeList list = collectNodes(doc, filteredNames);
        for (int i = 0; i < list.getLength(); i++)
            System.out.println(list.item(i).getNodeName());
    }

    private static NodeList collectNodes(Document doc, Set<String> filteredNames) {
        Node ret = doc.createElement("NodeList");
        collectNodes(doc, filteredNames, ret);
        return ret.getChildNodes();
    }

    private static void collectNodes(Node node, Set<String> filteredNames, Node ret) {
        NodeList chn = node.getChildNodes();
        for (int i = 0; i < chn.getLength(); i++) {
            Node child = chn.item(i);
            if (filteredNames.contains(child.getNodeName()))
                ret.appendChild(child);
            collectNodes(child, filteredNames, ret);
        }
    }
}

关于java - 如何使用DOM选择具有不同标签的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674559/

相关文章:

Java:2 个类,一个主类(测试器)和其他类(方法)。从测试器获取输入并传递给其他类的 ArrayList

java - 如何在javafx中保存选定的图像?

java - 如何将 ActionBar 标题设置在中间而不是默认的左对齐位置?

java - 如何轻松自定义 OptaPlanner 类(class)示例的 XML 输入文件?

javascript - 更改多行文本中每一行的文本对齐方式

jquery - 将 li 元素移出父 ul 并保留位置

java - Git 无法识别重命名和修改的包文件

java - Maven 依赖项已下载但在项目内部无法识别

xml - 将 WSDL 转换为 XML 工具?

javascript - 如何在 javascript 中对所有 child 的属性求和?