2012-09-10 57 views
3

的指數我有一個XML文件,類似格式DOCX,即:Python的LXML - 獲取標記的文字

<w:r> 
    <w:rPr> 
    <w:sz w:val="36"/> 
    <w:szCs w:val="36"/> 
    </w:rPr> 
    <w:t>BIG_TEXT</w:t> 
</w:r> 

編輯: 我需要在源XML獲得「BIG_TEXT」的指標,像:

from lxml import etree 
text = open('/devel/tmp/doc2/word/document.xml', 'r').read() 

root = etree.XML(text) 

start = 0 
for e in root.iter("*"): 
    if e.text: 
     offset = text.index(e.text, start) 
     l = len(e.text) 
     print 'Text "%s" at offset %s and len=%s' % (e.text, offset, l) 
     start = offset + l 

我可以從當前索引+ len(文本)的位置開始新的搜索,但有沒有另一種方式?元素可能有一個字符,例如w。它會找到w的索引,而不是標籤文本的索引w

+3

你期望的值的索引有哪些?行號+列?字節偏移量?到目前爲止您嘗試了什麼,但沒有奏效? –

回答

7

我正在尋找一個類似的解決方案(用於快速查找的大型xml文件中的節點索引)。

  • AFAIK,lxml只提供源代碼,這是不夠的。 Cf APIOriginal line number as found by the parser or None if unknown.
  • expat提供文件中的確切偏移量:CurrentByteIndex
    • start_element獲取處理程序,它返回標記的開始(即'<')偏移量。
    • char_data處理程序獲取,它返回數據的開始(例如您的示例中的'B')偏移量。

例子:

import xml.parsers.expat 

# handler functions for parser events, and housekeeping. 
class handler : 
    def __init__(self, current_parser) : 
     #tag of interest 
     self.TARGET_TAG = "w:t" 

     #set up parser 
     self.parser = current_parser 
     self.parser.StartElementHandler = self.start_element 
     self.parser.EndElementHandler = self.end_element 
     self.parser.CharacterDataHandler = self.char_data 

     self.target_tag_met = False 
     self.index = None 

    def start_element(self, name, attrs): 
     self.target_tag_met = (name == self.TARGET_TAG) 

    def end_element(self, name) : 
     self.target_tag_met = False 

    def char_data(self, data): 
     if self.target_tag_met : 
     self.index = self.parser.CurrentByteIndex 

#open file in binary mode for robuster byte offsets. 
xmlFile = open("so_test.xml", 'rb') 

p = xml.parsers.expat.ParserCreate() 
h = handler(p) 

p.ParseFile(xmlFile) 
print (h.index)