You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取XML文件:仅获取metadonnees节点下的factory及icone数据

解决Java XML解析:只获取<metadonnees>下的<factory>并提取<icone>数据

你遇到的问题核心是使用document.getElementsByTagName("factory")会遍历整个XML文档的所有<factory>节点,包括<simulation>里的那些,所以才会重复输出。另外你的外层循环其实没必要(因为XML里只有一个<metadonnees>节点),而且没有从<metadonnees>节点内部去查找子节点,而是直接从根document查找,导致范围不对。

下面是修正后的方案:


第一步:只获取<metadonnees>下的<factory>

首先要定位到<metadonnees>元素,然后从该元素内部调用getElementsByTagName("factory"),这样只会获取这个节点下的所有<factory>,而不会涉及<simulation>里的内容。

第二步:提取每个<factory>下的<icone>数据

对于每个<factory>元素,我们需要先找到它下面的<icones>节点,再遍历里面的<icone>子节点,提取type和path属性。


完整示例代码

// 假设你已经成功获取了Document对象document
// 第一步:获取metadonnees节点(这里用item(0)因为XML里只有一个)
Element metadonnees = (Element) document.getElementsByTagName("metadonnees").item(0);
// 第二步:从metadonnees内部获取所有factory节点
NodeList factoryList = metadonnees.getElementsByTagName("factory");

for (int i = 0; i < factoryList.getLength(); i++) {
    Node factoryNode = factoryList.item(i);
    if (factoryNode.getNodeType() == Node.ELEMENT_NODE) {
        Element factoryElement = (Element) factoryNode;
        // 获取factory的type属性
        String factoryType = factoryElement.getAttribute("type");
        System.out.println("Factory类型: " + factoryType);
        
        // 第三步:获取当前factory下的icones节点,再遍历icone
        Element icones = (Element) factoryElement.getElementsByTagName("icones").item(0);
        NodeList iconeList = icones.getElementsByTagName("icone");
        
        System.out.println("  包含的图标:");
        for (int j = 0; j < iconeList.getLength(); j++) {
            Element iconeElement = (Element) iconeList.item(j);
            String iconeType = iconeElement.getAttribute("type");
            String iconePath = iconeElement.getAttribute("path");
            System.out.println("    - 类型: " + iconeType + ", 路径: " + iconePath);
        }
        
        // 如果你还需要提取其他子节点(比如interval、out、enter),可以类似处理
        String interval = factoryElement.getElementsByTagName("interval").item(0).getTextContent().trim();
        System.out.println("  间隔时间: " + interval);
        System.out.println("------------------------");
    }
}

代码说明

  1. 缩小查找范围:从<metadonnees>元素内部查找<factory>,而不是整个文档,这样就不会拿到<simulation>里的<factory>。
  2. 层级遍历:每个<factory>内部的节点,都从当前<factory>元素出发查找,保证只处理该工厂下的子节点。
  3. 处理文本内容:比如<interval>的文本,用getTextContent().trim()去掉多余空格(你的XML里第二个interval有空格)。

输出结果示例

Factory类型: factory1
  包含的图标:
    - 类型: empty, 路径: src/ressources/UMP0%.png
    - 类型: half, 路径: src/ressources/UMP33%.png
    - 类型: full, 路径: src/ressources/UMP100%.png
  间隔时间: 100
------------------------
Factory类型: factory2
  包含的图标:
    - 类型: empty, 路径: src/ressources/UT0%.png
    - 类型: half, 路径: src/ressources/UT33%.png
    - 类型: full, 路径: src/ressources/UT100%.png
  间隔时间: 2
------------------------

内容的提问来源于stack exchange,提问作者tamim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:10