2

XML ファイルのサンプル

<GateDocument> 
  <GateDocumentFeatures>
    ...
  </GateDocumentFeatures>
  <TextWithNodes>
    <Node id="0"/>
    MESSAGE SET
    <Node id="19"/> 
    <Node id="20"/>
    1. 1/1/09 - sample text 1
    <Node id="212"/>
    sample text 2
    <Node id="223"/>
    sample text 3
    ...
    <Node id="160652"/>
  </TextWithNodes>
  <AnnotationSet></AnnotationSet>
  <AnnotationSet Name="SomeName">
    ...
  </AnnotationSet>
</GateDocument>

始めに、Python でコーディングして XML を扱うのはこれが初めてです。

私の目標は、特定のノード ID でサンプル テキストを抽出することです。

最初の試み - minidom を使用しましたが、これにより、抽出 (http://stackoverflow.com/questions/11122736/extracting-text-from-xml-node-with-minidom) を処理する正しい方法が得られませんでした。自己終了タグのノード ID の奇妙な形式。

2回目の試行-lxmlを見て提案を取り上げました。テキストを次のように抽出することに成功しました:

['\n\t\t','n\t\tMESSAGE SET\n\t\t','\n\t\t','\n\t\t1. 1/1/09 - sample text 1,....,'\n\t']

いくつかのクリーンアップで、テキストをうまく取得できると思いますが、関連するノード ID 値が失われます。

コードで:

from lxml import etree
from StringIO import StringIO
xmlfile = ('C:\...AnnotationsXML.xml')
xmldoc = etree.parse(xmlfile)  
print xmldoc.xpath("//TextWithNodes/text()")

だから私は私の質問は次のとおりだと思います:

  1. \n\t\t なしで上記を抽出する方法はありますか? スペースの書式設定(つまりタブ)であると読みましたが、どこに<Node id = 0>行ったのかわかりません。
  2. このファイルを抽出するためのより良い、またはより効率的な方法はありますか?

ありがとう!

4

1 に答える 1

7
In [1]: from lxml import etree

In [2]: tree = etree.parse('awful.xml')

In [3]: data = {int(node.attrib['id']): node.tail.strip()
   ...: for node in tree.xpath('//TextWithNodes/Node') if node.tail.strip()}

In [4]: data
Out[4]: 
{0: 'MESSAGE SET',
 20: '1. 1/1/09 - sample text 1',
 212: 'sample text 2',
 223: 'sample text 3'}

stripのようなものを取り除くために使用され、タグの後にテキスト\t\nを取ります。tail

于 2012-06-20T20:23:27.450 に答える