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("------------------------"); } }
代码说明
- 缩小查找范围:从
<metadonnees>元素内部查找<factory>,而不是整个文档,这样就不会拿到<simulation>里的<factory>。 - 层级遍历:每个
<factory>内部的节点,都从当前<factory>元素出发查找,保证只处理该工厂下的子节点。 - 处理文本内容:比如
<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
相关产品推荐
相关产品推荐

