如何访问ADDRESS.LIST节点并获取其XML节点值?
嘿,我来帮你解决访问ADDRESS.LIST节点并获取值的问题!你的XML结构里,ADDRESS.LIST是一个包含多个ADDRESS子节点的集合,下面我用几种主流编程语言来演示具体实现:
PHP 实现
首先要注意你的XML字符串是转义过的(包含<这类实体),得先解码回原始XML内容,再用SimpleXML来解析:
// 假设$result是你提供的转义后XML字符串 $xmlString = html_entity_decode($result); // 加载XML内容 $xml = simplexml_load_string($xmlString); // 因为节点名包含`.`,需要用字符串形式访问(避免PHP把`.`当成属性分隔符) $addressList = $xml->BODY->DATA->MESSAGE->{'ADDRESS.LIST'}; // 遍历每个ADDRESS子节点,获取文本值 foreach ($addressList->ADDRESS as $address) { echo (string)$address . PHP_EOL; }
这段代码会逐个输出每个ADDRESS节点里的"address text"内容。
Python 实现
用Python自带的xml.etree.ElementTree模块即可,同样先处理转义的XML字符串:
import xml.etree.ElementTree as ET import html # 解码转义的XML字符串 xml_string = html.unescape(result) # 解析XML root = ET.fromstring(xml_string) # 用XPath定位到ADDRESS.LIST节点 address_list = root.find('.//ADDRESS.LIST') if address_list is not None: # 遍历所有ADDRESS子节点 for address in address_list.findall('ADDRESS'): print(address.text.strip())
如果你的XML后续涉及到命名空间(比如示例里的xmlns:UDF="TallyUDF"),可以通过注册命名空间前缀来处理,不过当前示例里ADDRESS.LIST没用到该命名空间,所以无需额外操作。
Java 实现
用Java的DOM解析API来处理,步骤如下:
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.ByteArrayInputStream; import java.net.URLDecoder; public class AddressParser { public static void main(String[] args) { try { // 替换成你的$result字符串 String escapedXml = "<ENVELOPE> <HEADER> <VERSION>1</VERSION> <STATUS>1</STATUS> </HEADER> <BODY> <DESC></DESC> <DATA> <MESSAGE xmlns:UDF=\"TallyUDF\"> <ADDRESS.LIST TYPE=\"String\"> <ADDRESS>address text</ADDRESS> <ADDRESS>address text</ADDRESS> <ADDRESS>address text</ADDRESS> <ADDRESS>address text</ADDRESS> </ADDRESS.LIST></MESSAGE></DATA></BODY></ENVELOPE>"; // 解码转义的XML内容 String xmlString = URLDecoder.decode(escapedXml, "UTF-8"); // 构建XML文档对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes())); // 查找所有ADDRESS.LIST节点(这里假设只有一个) NodeList addressListNodes = doc.getElementsByTagName("ADDRESS.LIST"); if (addressListNodes.getLength() > 0) { Element addressList = (Element) addressListNodes.item(0); // 获取所有ADDRESS子节点 NodeList addresses = addressList.getElementsByTagName("ADDRESS"); // 遍历输出每个地址 for (int i = 0; i < addresses.getLength(); i++) { Element addressElem = (Element) addresses.item(i); System.out.println(addressElem.getTextContent().trim()); } } } catch (Exception e) { e.printStackTrace(); } } }
Java的getElementsByTagName方法可以直接处理带.的节点名,无需特殊语法。
关键注意点
- 转义字符处理:你的原始XML字符串是HTML转义后的,必须先解码才能正常解析;
- 特殊节点名:当节点名包含
.这类特殊字符时,部分语言需要用字符串形式访问(比如PHP的{'ADDRESS.LIST'}); - 命名空间:如果后续
ADDRESS.LIST或其子节点用到了UDF命名空间,需要在解析时注册并指定命名空间前缀。
内容的提问来源于stack exchange,提问作者TejpalBh
相关产品推荐
相关产品推荐

