xpath 错误,XPath 位置 >= 1 预期

xpath error, XPath position >= 1 expected

提问人:Dia 提问时间:11/18/2022 最后编辑:Dia 更新时间:11/19/2022 访问量:215

问:

我正在尝试从字符串中解析 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。

python-3.x xml xml 解析 elementtree

评论


答:

1赞 Daniel Haley 11/18/2022 #1

XPath 中的位置从 1 开始;不是 0。

所以位置谓词在:[0]

lst:item[0]

不会选择任何东西。

如果要选择 的第一个子项,请使用:lst:itemlst:datasources

lst:item[1]

评论

0赞 Michael Kay 11/18/2022
不幸的是是有效的(没有引发错误),它只是没有选择任何东西。如果这是一个错误,这个问题可能就没有必要了。item[0]
0赞 Daniel Haley 11/19/2022
@MichaelKay - 好点子,谢谢。我更新了我的答案,使其在技术上更加正确。