Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonFindall使用带有逻辑AND的xpath模式_Python_Xpath_Findall - Fatal编程技术网

PythonFindall使用带有逻辑AND的xpath模式

PythonFindall使用带有逻辑AND的xpath模式,python,xpath,findall,Python,Xpath,Findall,这是我的xpath: <Unit> <_unit_type>FSP</_unit_type> <_logicalId>FSM1/FSP1</_logicalId> </Unit> <Unit> <_unit_type>FSP</_unit_type> <_logicalId>FSM1/FSP2</_logicalId> </Unit>

这是我的xpath:

<Unit>
  <_unit_type>FSP</_unit_type>
  <_logicalId>FSM1/FSP1</_logicalId>
</Unit>
<Unit>
  <_unit_type>FSP</_unit_type>
  <_logicalId>FSM1/FSP2</_logicalId>
</Unit>

FSP
FSM1/FSP1
FSP
FSM1/FSP2
因此,当我的
xpath\u模式=.//Unit[\u unitType='FSP'][以(\u logicalId,'FSM1']开头时,我需要找到
len(root.findall(xpath\u模式)

如果我的模式是
//Unit[\u unitType='FSP']
,我的代码可以工作,我可以得到长度为2的值。但是我需要添加另一个限定符,因为我的xml文件要复杂得多

Im获取SyntaxError:使用此模式时谓词无效
//Unit[\u unitType='FSP'][以(\u logicalId,'FSM1']]开头

只需使用AND运算符即可添加所需的条件

例如,如果您正在寻找特定的“单位”:

您还可以使用“|”对多个XPath进行操作。Xpath1 | Xpath2 | Xpath3 |。。。 如果您正在寻找与Unit不同的产品:

//Unit[_unit_type='FSP'][starts-with(_logicalid,'FSM1')]|//Entity[_unit_type='XYZ'][starts-with(_logicalid,'FSM1')]

只需使用和运算符添加所需的条件

例如,如果您正在寻找特定的“单位”:

您还可以使用“|”对多个XPath进行操作。Xpath1 | Xpath2 | Xpath3 |。。。 如果您正在寻找与Unit不同的产品:

//Unit[_unit_type='FSP'][starts-with(_logicalid,'FSM1')]|//Entity[_unit_type='XYZ'][starts-with(_logicalid,'FSM1')]
你已经写信了

.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1']
这会导致无效谓词语法错误。这是因为缺少右括号。请尝试以下操作:

.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1')]
你已经写信了

.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1']
这会导致无效谓词语法错误。这是因为缺少右括号。请尝试以下操作:

.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1')]

问题在于
lxml
模块出于兼容性原因保留了两个不同的XPath引擎。来自:

findall()
是原始元素树API的一部分。它支持 XPath语言的简单子集,没有谓词、条件和其他高级功能。[…]

另一方面,xpath()支持xpath语言的全部功能,包括谓词、xpath函数和Python扩展函数

使用类似中的
xpath()
方法

from lxml import etree
root = etree.XML("""
<root> 
  <Unit> 
    <_unit_type>FSP</_unit_type>  
    <_logicalId>FSM1/FSP1</_logicalId> 
  </Unit>  
  <Unit> 
    <_unit_type>FSP</_unit_type>  
    <_logicalId>FSM1/FSP2</_logicalId> 
  </Unit> 
</root>""")
print(root.xpath(".//Unit[_unit_type='FSP'][starts-with(_logicalId,'FSM1')]"))
从lxml导入etree
root=etree.XML(“”)
FSP
FSM1/FSP1
FSP
FSM1/FSP2
""")
打印(root.xpath(“.//Unit[\u Unit\u type='FSP']][以(\u logicalId,'FSM1')]开头)
控制台输出:

[<Element Unit at 0x7fa1e0413140>, <Element Unit at 0x7fa1e04130f0>]
[,]

签入问题在于
lxml
模块出于兼容性原因保留了两个不同的XPath引擎。来自:

findall()
是原始元素树API的一部分。它支持 XPath语言的简单子集,没有谓词、条件和其他高级功能。[…]

另一方面,xpath()支持xpath语言的全部功能,包括谓词、xpath函数和Python扩展函数

使用类似中的
xpath()
方法

from lxml import etree
root = etree.XML("""
<root> 
  <Unit> 
    <_unit_type>FSP</_unit_type>  
    <_logicalId>FSM1/FSP1</_logicalId> 
  </Unit>  
  <Unit> 
    <_unit_type>FSP</_unit_type>  
    <_logicalId>FSM1/FSP2</_logicalId> 
  </Unit> 
</root>""")
print(root.xpath(".//Unit[_unit_type='FSP'][starts-with(_logicalId,'FSM1')]"))
从lxml导入etree
root=etree.XML(“”)
FSP
FSM1/FSP1
FSP
FSM1/FSP2
""")
打印(root.xpath(“.//Unit[\u Unit\u type='FSP']][以(\u logicalId,'FSM1')]开头)
控制台输出:

[<Element Unit at 0x7fa1e0413140>, <Element Unit at 0x7fa1e04130f0>]
[,]

签入

您要导入哪个python模块?除了fot,我不知道任何支持完整XPath标准的模块。我在解析xml文件时使用lxml。您要导入哪个python模块?除了fot,我不知道任何支持完整XPath标准的模块。我在解析xml文件时使用lxml。我有所有可能的AND运算符,即使是您所使用的那个ted,但我仍然收到无效谓词语法错误。:(如果在html代码中从unit_type和logicalid标记中删除下划线,会发生什么情况(标记中不允许使用下划线)?当然,对XPath也要这样做。此外,XPath是区分大小写的:逻辑连接运算符是
。我已经使用了所有可能的and运算符,即使是您发布的and运算符,但仍然会出现无效谓词语法错误。:(如果在html代码中从单元类型和logicalid标记中删除下划线,会发生什么情况(标记中不允许使用下划线)?当然,对XPath也可以这样做。此外,XPath区分大小写:逻辑连接运算符是