2012-06-20 76 views
2

XML文件示例最有效的方法,從這個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處理,很抱歉,如果我錯過真的很明顯事情!

我的目標是提取特定節點標識處的示例文本。

第一次嘗試 - 我用minidom,它沒有給我提取正確的方法(http://stackoverflow.com/questions/11122736/extracting-text-from-xml-node-with-minidom )由於自閉標籤中節點ID的奇怪格式。

第二次嘗試 - 我看着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. 是否有更好或更有效的方法提取此文件?

謝謝!

+1

要麼在你的路徑中使用正斜槓,要麼在窗口上使用原始字符串(r'...'),否則你會發現某些路徑中突然出現換行符和製表符。 – Daenyth

+0

'Node'元素和散佈在這些元素之間的文本之間的連接是什麼?這種XML格式看起來非常糟糕。 –

+0

@FrancisAvila我相信文本分析軟件(GATE)允許註釋文本。因此,我可以挑出一個單詞/短語並用特徵對其進行註釋。我認爲節點ID是整個文檔的起始索引,如果整個文檔是字符串的話。 (如果我正確地描述它) – Jasmine

回答

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\ntail需要標記後的文本。

+0

+1優雅使用詞典理解。重複調用'node.tail.strip()'是不幸的,但除非Python支持* en passant *賦值(* ha!as if!*),否則不可避免。 –

+0

太棒了。盯着它,並將一片一片地分開,直到我詳細掌握此解決方案的每個元素。快速的問題 - 我的消息出來了,但不是按照節點id的順序(但是,它全部存在),我只是好奇於'In [3]'它是不是從開始索引0開始按順序解析?'{0:'TEXT',40960:'TEXT2',106499:'TEXT3',90113:'TEXT4'}' – Jasmine

+0

@Jasmine我認爲它是按順序解析的,問題在於數據被保存到字典(當然,你可以改變它),字典也沒有秩序。你說你需要將文本與id關聯,所以我使用了一個字典。你可以選擇一個更合適的選項,但字典是一個相當靈活的結構。如果您需要將其存儲(確定),請使用列表。 –

相關問題