我有一个格式类似于 docx 的 xml 文件,即:
<w:r>
<w:rPr>
<w:sz w:val="36"/>
<w:szCs w:val="36"/>
</w:rPr>
<w:t>BIG_TEXT</w:t>
</w:r>
我需要获得一个索引BIG_TEXT
在源 xml 中,例如:
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
我可以从当前位置开始新的搜索index
+ len(text)
,但是还有别的办法吗?元素可以有一个字符,w
例如。它将找到索引w
,但不是标签文本的索引w
.
我一直在寻找类似的解决方案(在大 xml 文件中索引节点以进行快速查找)。
- AFAIK,
lxml
只提供源代码,这是不够的。 CFAPI http://lxml.de/api/lxml.etree._Element-class.html : Original line number as found by the parser or None if unknown.
- But
expat
provides the exact offset in the file : CurrentByteIndex http://docs.python.org/library/pyexpat.html#xml.parsers.expat.xmlparser.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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)