如何通过属性值获取XML节点特定值?规避索引依赖问题
问题描述
XML示例
<row id="1"> <column name="Date">30.01.2029 00:00:00 +02:00</column> <column name="Jackpot ID">sol_3430_32488</column> <column name="Jackpot Name">Level1</column> <column name="Jackpot Value">0</column> <column name="Casino Seed">87.5</column> <column name="Currency">USD</column> </row>
现有Java代码(按索引获取)
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(false); f.setValidating(false); DocumentBuilder b = f.newDocumentBuilder(); URLConnection urlConnection = new URL(url).openConnection(); urlConnection.addRequestProperty("Accept", "application/xml"); Document doc = b.parse(urlConnection.getInputStream()); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("row"); for (int itr = 0; itr < nodeList.getLength(); itr++) { Node node = nodeList.item(itr); ArrayList<String> tabInfo = new ArrayList<>(); if (node.getNodeType() ==Node.ELEMENT_NODE) { Element eElement = (Element) node; String data = eElement.getElementsByTagName("column").item(0).getTextContent(); String jpId = eElement.getElementsByTagName("column").item(1).getTextContent(); String jpValue = eElement.getElementsByTagName("column").item(2).getTextContent(); String casinoName = eElement.getElementsByTagName("column").item(3).getTextContent(); String casinoSeed = eElement.getElementsByTagName("column").item(4).getTextContent(); String casinoCurrency = eElement.getElementsByTagName("column").item(5).getTextContent(); } }
当前按索引获取的方式不可靠,当XML中缺少某个节点(比如Currency)时会直接报错,想知道能否通过节点的name属性来获取对应值?
解决方案
当然可以通过name属性获取对应节点的值,这种方式比按索引更鲁棒,能避免节点顺序变化或缺失导致的报错。
可以封装一个工具方法,遍历指定row节点下的所有column元素,根据name属性匹配并返回对应文本内容,未匹配到则返回预设默认值(空字符串或null),示例代码如下:
// 工具方法:根据name属性获取column节点的文本内容 private static String getColumnValue(Element rowElement, String targetName) { NodeList columns = rowElement.getElementsByTagName("column"); for (int i = 0; i < columns.getLength(); i++) { Element column = (Element) columns.item(i); String nameAttr = column.getAttribute("name"); if (targetName.equals(nameAttr)) { return column.getTextContent().trim(); } } // 未找到对应节点时返回空字符串,可根据需求改为null return ""; }
然后在原有循环中替换为该方法调用:
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(false); f.setValidating(false); DocumentBuilder b = f.newDocumentBuilder(); URLConnection urlConnection = new URL(url).openConnection(); urlConnection.addRequestProperty("Accept", "application/xml"); Document doc = b.parse(urlConnection.getInputStream()); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("row"); for (int itr = 0; itr < nodeList.getLength(); itr++) { Node node = nodeList.item(itr); ArrayList<String> tabInfo = new ArrayList<>(); if (node.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) node; // 通过name属性获取对应值 String data = getColumnValue(eElement, "Date"); String jpId = getColumnValue(eElement, "Jackpot ID"); String jpName = getColumnValue(eElement, "Jackpot Name"); String jpValue = getColumnValue(eElement, "Jackpot Value"); String casinoSeed = getColumnValue(eElement, "Casino Seed"); String casinoCurrency = getColumnValue(eElement, "Currency"); // 按需处理获取到的值,比如加入列表 tabInfo.add(data); tabInfo.add(jpId); // ... 其他字段处理 } }
优势
- 不受节点顺序影响:即使XML中
column节点的顺序调整,依然能正确获取对应值 - 容错性更强:当某个
column节点缺失时,只会返回预设默认值,不会抛出空指针异常 - 可读性更高:直接通过字段名称取值,逻辑更清晰
内容的提问来源于stack exchange,提问作者user3422485
相关产品推荐
相关产品推荐

