将字符串参数传递给 Xpath
passing string argument to Xpath
我真的很茫然。我正在尝试使用 xpath 和包含从 xml 文件中搜索数据标记 'MF22' 的文本字段。当我将搜索字符串直接包含在 contains 函数中时,它工作正常。但是当我尝试将它作为参数传递时,它 returns 文件中的所有内容。
from lxml import etree as ElementTree
ET = ElementTree.parse('USFLMEO_USSHARE_60200.txt')
bcnIDstr = "AB"
test1 = ET.xpath("//MF22[text()[contains(.,bcnIDstr)]]")
print 'found ' + str(len(test1)) + ' packets'
test2 = ET.xpath("//MF22[text()[contains(.,'AB')]]")
print 'found ' + str(len(test2)) + ' packets'
for elem in test1:
packet = elem.getparent()
for elem2 in packet:
print elem2.tag, elem2.text
所以在上面的代码中,'test2' 找到了所有正确的元素,但 'test1' 没有。 XML 数据如下。
<?xml version="1.0" ?>
<topMessage>
<header dest="366Z" orig="USFLMEO" number="60200" date="2015-10-02T00:00:59.000000000Z" />
<message>
<packetsMessage>
<packet>
<MF6>324</MF6>
<MF11>3669</MF11>
<MF71>2</MF71>
<MF22>9C634E2AB509240</MF22>
<MF77>FFFE2FCE31A7155A849207E5B34027500004</MF77>
<MF67>15 275 0000 40.147870</MF67>
<MF68>406033830.154</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>45.1169</MF72>
<MF73>399.987</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>318</MF6>
<MF11>3669</MF11>
<MF71>1</MF71>
<MF22>9C634E2AB509240</MF22>
<MF77>FFFE2FCE31A7155A849207E5B34027500004</MF77>
<MF67>15 275 0000 40.147850</MF67>
<MF68>406033830.673</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>40.0184</MF72>
<MF73>400.066</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>324</MF6>
<MF11>3669</MF11>
<MF71>2</MF71>
<MF22>9C02BE29630F0A0</MF22>
<MF77>FFFE2FCE015F14B18785039DABCE5A4EC14F</MF77>
<MF67>15 275 0000 42.922460</MF67>
<MF68>406033518.783</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>41.5108</MF72>
<MF73>400.053</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>315</MF6>
<MF11>3669</MF11>
<MF71>3</MF71>
<MF22>9C02BE29630F0A0</MF22>
<MF77>FFFE2FCE015F14B18785039DABCE5A4EC14F</MF77>
<MF67>15 275 0000 42.924905</MF67>
<MF68>406038122.646</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>41.0458</MF72>
<MF73>399.815</MF73>
<MF74>0000</MF74>
</packet>
</packetsMessage>
</message>
</topMessage>
提前致谢!
简单地说,您没有在 XPath 字符串
中连接 bcnIDstr
变量
test1 = ET.xpath("//MF22[text()[contains(.,'"+bcnIDstr+"')]]")
更重要的是,您的 XPath 可以缩短:
test1 = ET.xpath("//MF22[contains(.,'"+bcnIDstr+"')]")
或者,您可以使用字符串格式:
test1 = ET.xpath("//MF22[text()[contains(.,'{0}')]]".format(bcnIDstr))
test1 = ET.xpath("//MF22[contains(.,'{0}')]".format(bcnIDstr))
有一个 lxml
特定功能可以从 XPath 引用 python 变量:
bcnIDstr = "AB"
test1 = ET.xpath("//MF22[text()[contains(.,$foo)]]", foo=bcnIDstr)
文档:http://lxml.de/xpathxslt.html#the-xpath-method
这在您想要引用包含非字符串的 python 变量时特别有用,即 XML 元素,在这种情况下您不能对 python 使用字符串操作多变的。这是这种情况的一个例子:
我真的很茫然。我正在尝试使用 xpath 和包含从 xml 文件中搜索数据标记 'MF22' 的文本字段。当我将搜索字符串直接包含在 contains 函数中时,它工作正常。但是当我尝试将它作为参数传递时,它 returns 文件中的所有内容。
from lxml import etree as ElementTree
ET = ElementTree.parse('USFLMEO_USSHARE_60200.txt')
bcnIDstr = "AB"
test1 = ET.xpath("//MF22[text()[contains(.,bcnIDstr)]]")
print 'found ' + str(len(test1)) + ' packets'
test2 = ET.xpath("//MF22[text()[contains(.,'AB')]]")
print 'found ' + str(len(test2)) + ' packets'
for elem in test1:
packet = elem.getparent()
for elem2 in packet:
print elem2.tag, elem2.text
所以在上面的代码中,'test2' 找到了所有正确的元素,但 'test1' 没有。 XML 数据如下。
<?xml version="1.0" ?>
<topMessage>
<header dest="366Z" orig="USFLMEO" number="60200" date="2015-10-02T00:00:59.000000000Z" />
<message>
<packetsMessage>
<packet>
<MF6>324</MF6>
<MF11>3669</MF11>
<MF71>2</MF71>
<MF22>9C634E2AB509240</MF22>
<MF77>FFFE2FCE31A7155A849207E5B34027500004</MF77>
<MF67>15 275 0000 40.147870</MF67>
<MF68>406033830.154</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>45.1169</MF72>
<MF73>399.987</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>318</MF6>
<MF11>3669</MF11>
<MF71>1</MF71>
<MF22>9C634E2AB509240</MF22>
<MF77>FFFE2FCE31A7155A849207E5B34027500004</MF77>
<MF67>15 275 0000 40.147850</MF67>
<MF68>406033830.673</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>40.0184</MF72>
<MF73>400.066</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>324</MF6>
<MF11>3669</MF11>
<MF71>2</MF71>
<MF22>9C02BE29630F0A0</MF22>
<MF77>FFFE2FCE015F14B18785039DABCE5A4EC14F</MF77>
<MF67>15 275 0000 42.922460</MF67>
<MF68>406033518.783</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>41.5108</MF72>
<MF73>400.053</MF73>
<MF74>0000</MF74>
</packet>
<packet>
<MF6>315</MF6>
<MF11>3669</MF11>
<MF71>3</MF71>
<MF22>9C02BE29630F0A0</MF22>
<MF77>FFFE2FCE015F14B18785039DABCE5A4EC14F</MF77>
<MF67>15 275 0000 42.924905</MF67>
<MF68>406038122.646</MF68>
<MF69>0.000000</MF69>
<MF70>99999.999</MF70>
<MF72>41.0458</MF72>
<MF73>399.815</MF73>
<MF74>0000</MF74>
</packet>
</packetsMessage>
</message>
</topMessage>
提前致谢!
简单地说,您没有在 XPath 字符串
中连接bcnIDstr
变量
test1 = ET.xpath("//MF22[text()[contains(.,'"+bcnIDstr+"')]]")
更重要的是,您的 XPath 可以缩短:
test1 = ET.xpath("//MF22[contains(.,'"+bcnIDstr+"')]")
或者,您可以使用字符串格式:
test1 = ET.xpath("//MF22[text()[contains(.,'{0}')]]".format(bcnIDstr))
test1 = ET.xpath("//MF22[contains(.,'{0}')]".format(bcnIDstr))
有一个 lxml
特定功能可以从 XPath 引用 python 变量:
bcnIDstr = "AB"
test1 = ET.xpath("//MF22[text()[contains(.,$foo)]]", foo=bcnIDstr)
文档:http://lxml.de/xpathxslt.html#the-xpath-method
这在您想要引用包含非字符串的 python 变量时特别有用,即 XML 元素,在这种情况下您不能对 python 使用字符串操作多变的。这是这种情况的一个例子: