Python lxml XPath语法错误:predi无效

2024-09-30 16:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是描述表单的XML文件的一部分:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfHouse>
<XmlForm>
<houseNum>1</houseNum>
 <plan1> 
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2> 
</XmlForm>


<XmlForm>
<houseNum>2</houseNum>
 <plan1> 
  <coord>
    <X> 11.2  </X>
    <Y> 12.1  </Y>
    <Z> 13.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 255   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 211.2  </X>
    <Y> 212.1  </Y>
    <Z> 311.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 255   </B>
</color>
 </plan2> 
</XmlForm>
</ArrayOfHouse>

这是我的代码,用于恢复房屋1和2的每个平面图的坐标,问题在这一行coord=tree.findall("XmlForm/[houseNum=str(houseindex)],使用houseindex.__str__()时也会出现同样的问题

^{pr2}$

Tags: 文件表单versionxmlencodingcolorstrcoord
2条回答

你不能把“houseindex”注入字符串。在houseindex的for循环中也要小心,因为当前使用的范围(0,2)对应于0和1。根据您的xml示例,您希望使用range(1,3)。在

我相信你想要这样的东西(为了提高可读性,我稍微重构了你的代码):

import pandas as pd
from lxml import etree

tree = etree.parse("myexample.xml")

# recuperate the columns name for pandas dataframe
plan_list = tree.findall("XmlForm/[houseNum='1']/")
columns = [el.tag for el in plan_list[1:]]

# Declare pandas dataFrame
data = list()
for house_index in range(1, 3):
    for column in columns:

        element_text = "XmlForm/[houseNum='{index}']/{column}/coord/".format(index=house_index, column=column)
        coord = tree.findall(element_text)
        row = [cc.text for cc in coord]
        data.append(row)

df = pd.DataFrame(data, columns=list('XYZ'), dtype=float)
print(df)

在构造XPath表达式之前,您显然希望用Python解释str(houseindex)。(您的错误消息告诉您str()不是XPath函数。)

因此,将coord=tree.findall()的参数从

"XmlForm/[houseNum=str(houseindex)]/"+columns[index]+"/coord/"

^{pr2}$

对XPath还有两个修正:

  1. 删除/上谓词之前的/。在
  2. houseNum的相等测试周围添加引号。在

最后的XPath没有进一步的语法错误

以下XPath将所有三个修复组合在一起,没有进一步的语法错误:

"XmlForm[houseNum='"+str(houseindex)+"']/"+columns[index]+"/coord/"

相关问题 更多 >