Python中的条件XML解析

时间:2018-04-12 09:19:01

标签: xml python-3.x xpath xml-parsing

如果父元素具有某些信息,我想在非常大的xml文件中选择所有子元素的信息。如果在示例代码中,节点sn的属性包含 elliptic =“yes”,则选择 v 节点并检索属性值(例如wd =“vulgui”) “)。

 <sentence>
<sadv arg="argM" func="cc" tem="tmp">
  <sadv>
    <grup.adv>
      <r lem="després" pos="rg" wd="Després"/>
      <sp>
        <prep>
          <s lem="de" pos="sps00" postype="preposition" wd="de"/>
        </prep>
        <sn entityref="nne">
          <spec gen="m" num="p">
            <z lem="15" ne="number" wd="15"/>
          </spec>
          <grup.nom gen="m" num="p">
            <n gen="m" lem="any" num="p" pos="ncmp000" postype="common" sense="16:10917509" wd="anys"/>
            <sp>
              <prep>
                <s lem="de" pos="sps00" postype="preposition" wd="de"/>
              </prep>
              <sn entityref="nne">
                <spec gen="f" num="s">
                  <d coreftype="ident" entity="entity3" entityref="nne" gen="f" lem="el_seu" num="s" person="3" pos="dp3fs0" postype="possessive" wd="la_seva"/>
                </spec>
                <grup.nom gen="f" num="s">
                  <n gen="f" lem="creació" num="s" pos="ncfs000" postype="common" sense="16:00583085" wd="creació"/>
                </grup.nom>
              </sn>
            </sp>
          </grup.nom>
        </sn>
      </sp>
    </grup.adv>
  </sadv>
  <f lem="," pos="fc" punct="comma" wd=","/>
</sadv>
<sn arg="arg0" coreftype="ident" **elliptic="yes"** entity="entity3" entityref="nne" func="suj" tem="agt"/>
<grup.verb>
  <v lem="presentar" lss="A32.ditransitive-patient-benefactive" mood="indicative" num="p" person="3" pos="vmip3p0" postype="main" tense="present" **wd="presenten"**/>
</grup.verb>
<sn arg="arg1" entityref="spec" func="cd" tem="pat">
  <spec gen="m" num="s">
    <d gen="m" lem="un" num="s" pos="di0ms0" postype="indefinite" wd="un"/>
  </spec>
  <grup.nom gen="m" num="s">
    <s.a gen="m" num="s">
      <grup.a gen="m" num="s">
        <a gen="m" lem="nou" num="s" pos="aq0ms0" postype="qualificative" wd="nou"/>
      </grup.a>
    </s.a>
    <n gen="m" lem="disc" num="s" pos="ncms000" postype="common" sense="16:03112307" wd="disc"/>
    <sn entityref="ne" ne="other">
      <f lem="," pos="fc" punct="comma" wd=","/>
      <grup.nom>
        <f lem="'" pos="fz" punct="mathsign" wd="'"/>
        <n lem="Electroretard" ne="other" pos="np0000a" postype="proper" sense="16:cs1" wd="Electroretard"/>
        <f lem="'" pos="fz" punct="mathsign" wd="'"/>
      </grup.nom>
    </sn>
  </grup.nom>
</sn>
<f lem="." pos="fp" punct="period" wd="."/>

我在以下之后无法提出解决方案:

for sn in root.iter('sn'):
rank = sn.get('elliptic')
if rank == 'yes':

我怎么能继续这行代码?我想的是:

“遍历所有父母包含@ elliptic =”是“

的孩子

1 个答案:

答案 0 :(得分:1)

据我所知,最简单的方法是构建xpath并将其放入try - &gt; if / except block:

xpath = '(//sn[@elliptic="yes"])[1]'

现在创建一个if语句来检查这个元素是否在你的xml组中,如果它存在,那就做你需要的。 例如。如果这是真的,那么使用另一个xpath或等来提取所需的内容。

P.S。这个[1]意味着你在xml中搜索第一个元素,如果有多个,那么没有它,它就会破坏。因此,创建将在xpath i

中的迭代器(//sn[@elliptic="yes"])[i]