2016-09-23 10 views
1

ノードに同じサブ構造を持つ2つの子ノードがあるXMLファイル(実際にはxliffファイル)があります(これは先験的にはわかりませんが、非常に複雑で、それぞれ<trans-unit>に対して変更されます) 。私はPythonとlxmlのライブラリ...例で働いている:あなたが見ることができるようにxpathで対応するXMLノードを取得

<trans-unit id="tu4" xml:space="preserve"> 
    <seg-source> 
     <mrk mid="0" mtype="seg"> 
      <g id="1">...</g> 
      <g id="2">...</g> 
      <g id="3">...</g> 
      <bx id="7"/>... 
     </mrk> 
     <mrk mid="1" mtype="seg">...</mrk> 
     <mrk mid="2" mtype="seg">... 
      <ex id="7"/> 
      <g id="8"> FROM HERE </g> 
     </mrk> 
    </seg-source> 
    <target xml:lang="en"> 
     <mrk mid="0" mtype="seg"> 
      <g id="1">...</g> 
      <g id="2">...</g> 
      <g id="3">...</g> 
      <bx id="7"/>... 
     </mrk> 
     <mrk mid="1" mtype="seg">...</mrk> 
     <mrk mid="2" mtype="seg">... 
      <ex id="7"/> 
      <g id="8"> TO HERE </g> 
     </mrk> 
    </target> 
</trans-unit> 

、2つのノード<seg-source><target>がまったく同じサブ構造を有しています。私の目標は、<seg-source>の各ノードに移動し、そのノードのテキストと尾を取得して(そして私はxpathでそれを行う方法を知っています)、それらを翻訳し、最後に(これは私が何をするかわからない) <target>の対応するノードに割り当てます。

他の言葉では...私はノード "ここから"を得ると仮定します...ノードを "ここに"取得するにはどうすればいいですか?

from lxml import etree 

tree = etree.fromstring(x) 
nodes = iter(tree.xpath("//*[self::seg-source or self::target]")) 
for seq, tar in zip(nodes, nodes): 
    # each node will be the matching nodes from each seq-source and target 
    print(seq.xpath(".//*")) 
    print(tar.xpath(".//*")) 

を任意の2つだけがありますので、各trans-unitあなただけnodes = iter(tree.xpath("//trans-unit/*"))を使用することができます/:あなたがそれらをペアにしたい場合は、それぞれのマッチングコードにアクセスできるように

+0

手で行う必要がある理由はありますか?すでにPythonに存在するXLIFFの実装を見てきましたか? (例えば、[翻訳ツールキット]の 'xliff'モジュール(https://github.com/translate/translate/tree/master/translate/misc) –

答えて

0

すべてあなたが一緒にノードをジップだけでした内部のノードの名前は関係ありません。

nodes = iter(tree.xpath("/trans-unit/*")) 
for seq, tar in zip(nodes, nodes): 
    print(seq.xpath(".//*")) 
    print(tar.xpath(".//*")) 

私たちはあなたのサンプルのコードを実行し、各IDのノードを印刷する場合は、出力がそれぞれから1を取得見ることができます:

In [2]: from lxml import etree 

In [3]: tree = etree.fromstring(x) 

In [4]: nodes = iter(tree.xpath("//trans-unit/*")) 

In [5]: for seq, tar in zip(nodes, nodes): 
    ...:   print(seq.xpath(".//g[@id='8']/text()")) 
    ...:   print(tar.xpath(".//g[@id='8']/text()")) 
    ...:  
[' FROM HERE '] 
[' TO HERE '] 

を各ノードトランスユニットのそれぞれの子から対応するノードであります:

In [7]: for seq, tar in zip(nodes, nodes): 
    ...:   print(seq.tag, tar.tag) 
    ...:   for n1, n2 in zip(seq.xpath(".//*"),tar.xpath(".//*")): 
    ...:     print(n1.tag, n2.tag) 
    ...:   
('seg-source', 'target') 
('mrk', 'mrk') 
('g', 'g') 
('g', 'g') 
('g', 'g') 
('bx', 'bx') 
('mrk', 'mrk') 
('mrk', 'mrk') 
('ex', 'ex') 
('g', 'g') 
+0

パドレッチに感謝しますが、 zipを使用する必要があります...私はあなたのソリューションについて考えましたが、どのような子供たちがどのような種類のソースとターゲットを持っているのかわからないので、私はそれらをループする必要があります。私はseg-sourceノードを持っています。私は次のようなものを使用します: 'すべての既存の子ノードをループするための' seg-source.xpath( './/*')のaChild ... 'target'ノード内の対応するノードへのポインタを取得します... – Attilio

+0

構造は同じですので、各リストの各ノードは対応するノードです –

+0

同じものであることを示す答えを編集しました。ターゲットノード*内の対応するノードへのポインタ、それはあなたが持っているものとまったく同じです。 –

関連する問題