如何提取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
相关产品推荐
相关产品推荐

