如何配置XML双过滤条件匹配指定name且value含冒号的节点
XML双条件过滤实现方案
筛选规则
- 匹配
name属性值为SHIPMENT.ORDERS.ORREFNUMS.REFNUM_VALUE的<inputData>节点 - 该节点下
<values>包含的<value>子节点,文本内容必须包含英文冒号:
匹配逻辑实现
直接通过XPath即可完成双条件过滤,由于示例XML带默认命名空间,用local-name()忽略命名空间匹配即可,表达式如下:
//*[local-name()='inputData' and @name='SHIPMENT.ORDERS.ORREFNUMS.REFNUM_VALUE']/*[local-name()='values']/*[local-name()='value' and contains(text(), ':')]
上述表达式会直接返回所有同时满足两个条件的
<value>节点,不需要额外做多层遍历判断。
示例验证
针对给出的示例XML,四个<value>节点的文本分别为24-100、RC3.B726030-001-CO8MODF183896704、Y、2022-06-23 23:59:59,仅最后一个时间格式的内容包含英文冒号,会被该表达式命中。
代码调用参考(Python lxml库)
from lxml import etree # 传入待处理XML xml_str = """ <inputData name="SHIPMENT.ORDERS.ORREFNUMS.REFNUM_VALUE" xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating"> <values xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating"> <value xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating">24-100</value> <value xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating">RC3.B726030-001-CO8MODF183896704</value> <value xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating">Y</value> <value xmlns="http://xmlns.oracle.com/apps/otm/ExternalRating">2022-06-23 23:59:59</value> </values> </inputData> """ root = etree.fromstring(xml_str.encode("utf-8")) result = root.xpath("//*[local-name()='inputData' and @name='SHIPMENT.ORDERS.ORREFNUMS.REFNUM_VALUE']/*[local-name()='values']/*[local-name()='value' and contains(text(), ':')]") # 输出匹配结果 for item in result: print(item.text)
运行输出:
2022-06-23 23:59:59
内容的提问来源于stack exchange,提问作者nagarjunareddy akula
相关产品推荐
相关产品推荐

