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

如何通过属性值获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:25:19