如何用XPATH解析XML动态元素属性并映射elementId与Group ID列表
解决思路与代码实现
你的XPath表达式错误在于多余的/text()——ELEMENT节点的直接子节点是GROUPS,而非文本节点,通过/text()会定位到ELEMENT的文本内容(如果有的话),而文本节点不存在GROUPS子节点,所以返回null。
正确处理步骤
- 定位符合条件的ELEMENT节点:用
//ELEMENT[@elementId > 0]选中所有elementId大于0的ELEMENT节点。 - 提取对应GROUP的id属性:对每个ELEMENT节点,通过
./GROUPS/GROUP/@id获取其下所有GROUP的id属性值。
Java代码示例
import org.apache.xpath.CachedXPathAPI; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class XPathXmlParser { public static void main(String[] args) throws Exception { // 加载XML文档 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("your-xml-file.xml")); CachedXPathAPI xpathAPI = new CachedXPathAPI(); Map<String, ArrayList<Integer>> elementGroupMap = new HashMap<>(); // 定位所有符合条件的ELEMENT节点 NodeList elementNodes = xpathAPI.selectNodeList(doc, "//ELEMENT[@elementId > 0]"); for (int i = 0; i < elementNodes.getLength(); i++) { Node elementNode = elementNodes.item(i); // 获取当前ELEMENT的elementId String elementId = elementNode.getAttributes().getNamedItem("elementId").getNodeValue(); // 获取当前ELEMENT下所有GROUP的id属性 NodeList groupIdNodes = xpathAPI.selectNodeList(elementNode, "./GROUPS/GROUP/@id"); ArrayList<Integer> groupIds = new ArrayList<>(); for (int j = 0; j < groupIdNodes.getLength(); j++) { String idStr = groupIdNodes.item(j).getNodeValue(); groupIds.add(Integer.parseInt(idStr)); } elementGroupMap.put(elementId, groupIds); } // 输出目标格式的映射结果 for (Map.Entry<String, ArrayList<Integer>> entry : elementGroupMap.entrySet()) { System.out.println("{\"" + entry.getKey() + "\": " + entry.getValue() + "}"); } } }
关键说明
- 不要在路径中错误插入
/text(),除非明确需要获取节点的文本内容。 - 使用
./开头的相对路径,确保从当前ELEMENT节点出发查找子节点,而非从文档根节点重新遍历。 - 通过
@id直接获取属性值即可,属性节点的节点值就是属性本身的内容,无需额外/text()。
内容的提问来源于stack exchange,提问作者VitalyT
相关产品推荐
相关产品推荐

