如何忽略大小写遍历Name为myvalue的Parameter标签?
不区分大小写查找XML中指定属性的Parameter标签实现方案
1. 通用XPath表达式方案
直接用XPath的translate()函数统一大小写后匹配,能快速定位所有符合条件的标签:
//Parameter[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='myvalue']
原理:把Name属性的所有大写字母转为小写,再与小写的myvalue做等值匹配,自动忽略大小写差异。
2. Python 具体实现
2.1 用标准库 xml.etree.ElementTree
无需额外依赖,手动遍历判断大小写:
import xml.etree.ElementTree as ET # 替换为你的XML内容或文件路径 xml_content = """ <Interface> <Header>...</Header> <Body>...</Body> <Footer>...</Footer> <Parameters> <Parameter Name="myvalue"> <Type>string</Type> </Parameter> <Parameter Name="p1"> <Type>string</Type> </Parameter> <Parameter Name="MYVALUE"> <Type>int</Type> </Parameter> </Parameters> </Interface> """ # 解析XML tree = ET.fromstring(xml_content) # 筛选目标标签 target_parameters = [] for param in tree.findall(".//Parameter"): name_attr = param.get("Name") if name_attr and name_attr.lower() == "myvalue": target_parameters.append(param) # 遍历处理结果 for idx, param in enumerate(target_parameters, 1): type_text = param.find("Type").text print(f"第{idx}个匹配标签:Type = {type_text}")
2.2 用 lxml 库(支持XPath更高效)
如果项目已用lxml,直接用XPath表达式一次性定位:
from lxml import etree xml_content = """ <Interface> <Header>...</Header> <Body>...</Body> <Footer>...</Footer> <Parameters> <Parameter Name="myvalue"> <Type>string</Type> </Parameter> <Parameter Name="p1"> <Type>string</Type> </Parameter> <Parameter Name="MYVALUE"> <Type>int</Type> </Parameter> </Parameters> </Interface> """ tree = etree.fromstring(xml_content) # 用XPath筛选 target_parameters = tree.xpath("//Parameter[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='myvalue']") # 遍历结果 for param in target_parameters: print(f"匹配标签Type:{param.find('Type').text}")
3. Java 具体实现(DOM解析)
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; public class XmlParameterFinder { public static void main(String[] args) throws Exception { String xmlContent = """ <Interface> <Header>...</Header> <Body>...</Body> <Footer>...</Footer> <Parameters> <Parameter Name="myvalue"> <Type>string</Type> </Parameter> <Parameter Name="p1"> <Type>string</Type> </Parameter> <Parameter Name="MYVALUE"> <Type>int</Type> </Parameter> </Parameters> </Interface> """; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(xmlContent.getBytes())); NodeList paramNodes = doc.getElementsByTagName("Parameter"); for (int i = 0; i < paramNodes.getLength(); i++) { Element paramElement = (Element) paramNodes.item(i); String nameAttr = paramElement.getAttribute("Name"); if (nameAttr != null && nameAttr.equalsIgnoreCase("myvalue")) { String typeText = paramElement.getElementsByTagName("Type").item(0).getTextContent(); System.out.println("匹配到的标签Type:" + typeText); } } } }
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

