提问人:Dia 提问时间:11/18/2022 最后编辑:Dia 更新时间:11/19/2022 访问量:215
xpath 错误,XPath 位置 >= 1 预期
xpath error, XPath position >= 1 expected
问:
我正在尝试从字符串中解析 xml。
下面是字符串中的 xml。
<xc:Application class="bril::lumistore::Application" id="111" instance="0" logpolicy="inherit" network="local" service="lumistore">
<ns4:properties xsi:type="soapenc:Struct">
<ns4:datasources soapenc:arrayType="xsd:ur-type[1]" xsi:type="soapenc:Array">
<ns4:item soapenc:position="[0]" xsi:type="soapenc:Struct">
<ns4:properties xsi:type="soapenc:Struct">
<ns4:bus xsi:type="xsd:string">brildata</ns4:bus>
<ns4:topics xsi:type="xsd:string">tcds,beam,bestlumi,bcm1fagghist,bcm1flumi,bcm1fbkg,pltaggzero,pltlumizero,hfoclumi,hfOcc1Agg,bunchmask,ScopeData,atlasbeam,hfetlumi,hfEtSumAgg,hfafterglowfrac,hfEtPedestal,dtlumi,bunchlength,radmonraw,radmonflux,radmonlumi,pltslinklumi,bcm1futca_bkg12,bcm1futca_background,bcm1futcalumi,remuslumi,remuslumi_5514,remuslumi_5515,remuslumi_5516,remuslumi_5517,bcm1futca_agg_hist</ns4:topics>
</ns4:properties>
</ns4:item>
</ns4:datasources>
<ns4:maxstalesec xsi:type="xsd:unsignedInt">30</ns4:maxstalesec>
<ns4:checkagesec xsi:type="xsd:unsignedInt">10</ns4:checkagesec>
<ns4:maxsizeMB xsi:type="xsd:unsignedInt">120</ns4:maxsizeMB>
<ns4:fileformat xsi:type="xsd:string">hd5</ns4:fileformat>
<ns4:filepath xsi:type="xsd:string">/scratch/central_current</ns4:filepath>
<ns4:nrowperwbuf xsi:type="xsd:unsignedInt">102</ns4:nrowperwbuf>
<ns4:workinterval xsi:type="xsd:unsignedInt">50000</ns4:workinterval>
</ns4:properties>
</xc:Application>
这是我用来解析字符串的代码
import xml.etree.ElementTree as ET
root = ET.fromstring(xml)
node = root.find(field['xpath'], ns)
哪里
field['xpath'] = ".//xc:Application[@class='bril::lumistore::Application']/lst:properties/lst:datasources/lst:item[0]/lst:properties/lst:topics"
和
ns = {'xc': 'http://path/XMLConfiguration-30', 'lst': 'urn:application-urn:bril::lumistore::Application'}
我收到以下错误
XPath position >= 1 expected
Traceback (most recent call last):
File "/usr/lib64/python3.6/xml/etree/ElementPath.py", line 263, in iterfind
selector = _cache[cache_key]
KeyError: (".//xc:Application[@class='bril::lumistore::Application']/lst:properties/lst:datasources/lst:item[0]/lst:properties/lst:topics", (('lst', 'urn:application-urn:bril::lumistore::Application'), ('xc', 'http://path/XMLConfiguration-30')))
During handling of the above exception, another exception occurred:
SyntaxError: XPath position >= 1 expected
任何帮助都非常感谢
注意:Usin Python 2.7 似乎工作正常,但不适用于 Python 3.6。
答:
1赞
Daniel Haley
11/18/2022
#1
XPath 中的位置从 1 开始;不是 0。
所以位置谓词在:[0]
lst:item[0]
不会选择任何东西。
如果要选择 的第一个子项,请使用:lst:item
lst:datasources
lst:item[1]
评论
0赞
Michael Kay
11/18/2022
不幸的是是有效的(没有引发错误),它只是没有选择任何东西。如果这是一个错误,这个问题可能就没有必要了。item[0]
0赞
Daniel Haley
11/19/2022
@MichaelKay - 好点子,谢谢。我更新了我的答案,使其在技术上更加正确。
评论