2

XMLは私にカーブボールを投げ続けます。理解できるマニュアルを見つけるのに苦労しています。ですから、過去数日間のすべての質問についてお詫び申し上げます。

いずれにせよ、私は次のXMLを持っています:

      <clade>
        <clade>
          <branch_length>0.5</branch_length>
          <clade>
            <name>MnPV1</name>
            <annotation>
<desc>Iotapapillomavirus 1</desc></annotation><chart><group>Iota</group></chart><branch_length>1.0</branch_length>
          </clade>
          <clade> 

これを次のように変更したいと思います。

  <clade>
    <clade>
      <branch_length>0.5</branch_length>
      <clade>
        <name bgstyle="green">MnPV1</name>
        <annotation><desc>Iotapapillomavirus 1</desc><uri>http://pave.niaid.nih.gov/#fetch?id=MnPV1REF&amp;format=Locus%20view&amp;hasStructure=none</uri></annotation><chart><group>Iota</group></chart><branch_length>1.0</branch_length>
      </clade>
      <clade>

だから私は変えたい:

<name>MnPV1</name>

に:

<name bgstyle="green">MnPV1</name>

キャッチは、私が探しているのは:

tree.xpath('//phylo:group[text()="Iota"]

もしそうなら、「グループ」ノードの「おじ」を取得したいので、「名前」ノードを編集できます

これは私がこれまでに思いついたものです:

tree = lxml.etree.XML(data)
nsmap = {'phylo': 'http://www.phyloxml.org'}
matches = tree.xpath('//phylo:group[text()="Iota"]', namespaces=nsmap)
for e in matches:
    uncle=e.getparent().getsibling() #however, getsibling() does not exist...

助けていただければ幸いです(および/またはダミーのlxmlに関する推奨事項)

4

2 に答える 2

5

これはどう?

>>> data = r'''<clade>
...  <name>MnPV1</name>
...  <annotation>
...    <desc>Iotapapillomavirus 1</desc>
...  </annotation>
...  <chart>
...    <group>Iota</group>
...  </chart>
...  <branch_length>1.0</branch_length>
... </clade>'''
...
>>> tree = lxml.etree.XML(data)
>>> for name in tree.xpath('//group[text()="Iota"]/../preceding-sibling::name'):
...   name.attrib['bgstyle'] = 'green'
...
>>> print lxml.etree.tostring(tree, pretty_print=True)
<clade>
 <name bgstyle="green">MnPV1</name>
 <annotation>
   <desc>Iotapapillomavirus 1</desc>
 </annotation>
 <chart>
   <group>Iota</group>
 </chart>
 <branch_length>1.0</branch_length>
</clade>

>>>

その秘訣は、XML ツール (XPath や XSLT など) を使用して XML ドキュメントを操作することです。w3schools サイトは、出発点として非常に適しています。XPath は、それ自体が非常に強力であり、慣れると非常に読みやすくなります。ただし、この種の問題は XSLT を使用して解決するのが最適です。大量の XML を操作する予定がある場合は、Oxygen XML エディターまたは類似のものを購入してください。

XPath を減らして Python を多用したものを探している場合は、 のgetparent後に の呼び出しを使用しgetpreviousます。どれだけサポートされているかはわかりませんgetparentgetprevious、文書化されており、機能しています。

于 2012-08-16T02:11:12.687 に答える
2

簡単な XSLT ソリューションを次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="clade[chart/group='Iota']/name">
  <name bgstyle="green"><xsl:apply-templates/></name>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<clade>
    <clade>
        <branch_length>0.5</branch_length>
        <clade>
            <name>MnPV1</name>
            <annotation>
                <desc>Iotapapillomavirus 1</desc>
            </annotation>
            <chart>
                <group>Iota</group>
            </chart>
            <branch_length>1.0</branch_length>
        </clade>
    </clade>
</clade>

必要な正しい結果が生成されます。

<clade>
   <clade>
      <branch_length>0.5</branch_length>
      <clade>
         <name bgstyle="green">MnPV1</name>
         <annotation>
            <desc>Iotapapillomavirus 1</desc>
         </annotation>
         <chart>
            <group>Iota</group>
         </chart>
         <branch_length>1.0</branch_length>
      </clade>
   </clade>
</clade>

説明:

  1. すべてのノードを「そのまま」コピーする (実行のために選択された)アイデンティティ ルールの使用およびオーバーライド。

  2. 必要な要素に一致する単純なオーバーライド テンプレートnameを、目的の新しい属性を持つ同じ名前の要素に置き換えます。

于 2012-08-16T12:18:53.187 に答える