如何使用XPath选择属性名以指定字符串结尾的元素并提取属性值?
提取XML中属性名以
_1结尾的属性值解决方案 嘿,我完全懂你现在的痛点——想从XML里捞所有属性名以_1结尾的属性值,但卡在了怎么精准匹配属性名后缀,还有准确获取对应值这两步对吧?下面我给你分几种常用的实现方式,都是实战里好用的方法,你可以按需选:
方法一:Python 标准库 xml.etree.ElementTree
这是Python自带的XML处理库,不用额外安装,适合快速实现:
import xml.etree.ElementTree as ET # 解析XML文件(如果是字符串的话用ET.fromstring(xml_str)) tree = ET.parse('your_target.xml') root = tree.getroot() # 用来存储目标属性值的列表 target_values = [] # 遍历XML里的所有元素 for element in root.iter(): # 遍历当前元素的所有属性 for attr_name, attr_value in element.attrib.items(): # 检查属性名是否以"_1"结尾 if attr_name.endswith('_1'): target_values.append(attr_value) # 输出结果 print("所有符合条件的属性值:", target_values)
方法二:Python lxml + XPath(更简洁高效)
如果你的XML结构复杂,用XPath可以直接一步筛选,lxml对XPath的支持更完善,需要先安装pip install lxml:
from lxml import etree # 解析XML文件 tree = etree.parse('your_target.xml') # 用XPath表达式直接匹配所有属性名以"_1"结尾的属性值 # local-name() 获取属性的本地名称(避免命名空间干扰),ends-with判断后缀 target_values = tree.xpath('//@*[ends-with(local-name(), "_1")]') print("所有符合条件的属性值:", target_values)
方法三:Java 实现(DOM + XPath)
如果是Java环境,也可以用原生的XML API结合XPath来实现:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; public class XmlAttrExtractor { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("your_target.xml"); XPath xpath = XPathFactory.newInstance().newXPath(); // 同样用ends-with筛选属性名后缀 String xpathExpr = "//@*[ends-with(local-name(), '_1')]"; NodeList attrNodes = (NodeList) xpath.evaluate(xpathExpr, doc, javax.xml.xpath.XPathConstants.NODESET); // 遍历输出结果 System.out.println("所有符合条件的属性值:"); for (int i = 0; i < attrNodes.getLength(); i++) { System.out.println(attrNodes.item(i).getNodeValue()); } } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 如果你的XML带有命名空间,XPath表达式需要做调整,比如在
lxml里需要先注册命名空间,或者用*通配前缀; - 不管用哪种方法,核心逻辑都是:遍历所有属性 → 检查属性名是否以
_1结尾 → 收集对应的值。
内容的提问来源于stack exchange,提问作者tehdima
相关产品推荐
相关产品推荐

