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

如何提取XML响应中Contract节点文本并排序存入ArrayList?

解决XML多Contract节点文本提取与排序问题

问题的核心在于你调用的doc.Contracts.text()会把所有<Contract>节点的文本内容直接拼接在一起,所以才会得到AB这种结果。要单独提取每个Contract的值,你需要逐个遍历每个<Contract>节点,而不是直接取父节点的文本。

下面是具体的实现步骤和代码示例(以Java常见的XML解析方式为例):

步骤说明

  • 先定位到<Itinerary>节点(确保只处理这个节点下的<Contract>)
  • 获取该节点下所有的<Contract>子节点集合
  • 遍历集合,逐个提取每个节点的文本(记得去除前后空白,避免XML里的换行/空格干扰)
  • 将有效文本存入ArrayList
  • 调用排序方法对列表按字母顺序排序

代码示例(Java DOM解析)

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.Collections;

// 假设你的XML文档已经解析到doc变量中
Node itineraryNode = doc.getElementsByTagName("Itinerary").item(0);
ArrayList<String> contractList = new ArrayList<>();

if (itineraryNode != null && itineraryNode.getNodeType() == Node.ELEMENT_NODE) {
    Element itineraryElem = (Element) itineraryNode;
    NodeList contractNodes = itineraryElem.getElementsByTagName("Contract");

    for (int i = 0; i < contractNodes.getLength(); i++) {
        Node contractNode = contractNodes.item(i);
        // 提取文本并去除前后空白
        String contractValue = contractNode.getTextContent().trim();
        // 跳过空文本(如果XML里有空白的<Contract>节点)
        if (!contractValue.isEmpty()) {
            contractList.add(contractValue);
        }
    }

    // 按字母顺序排序
    Collections.sort(contractList);
}

// 此时contractList里就是排序后的A、B(或其他Contract值)

如果你用JDOM2(更简洁的API)

如果项目中使用JDOM2库,代码会更直观:

import org.jdom2.Document;
import org.jdom2.Element;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// 假设doc是JDOM2的Document对象
Element itineraryElem = doc.getRootElement().getChild("Itinerary");
ArrayList<String> contractList = new ArrayList<>();

if (itineraryElem != null) {
    List<Element> contractElements = itineraryElem.getChildren("Contract");
    for (Element contractElem : contractElements) {
        String contractValue = contractElem.getTextTrim();
        if (!contractValue.isEmpty()) {
            contractList.add(contractValue);
        }
    }
    Collections.sort(contractList);
}

关键就是不要直接从父节点取文本,而是遍历每个目标子节点,单独提取每个节点的内容,这样不管每个Contract值长度如何,都能准确获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:07