我有一个xml文件,其格式类似于docx,即:
<w:r>
<w:rPr>
<w:sz w:val="36"/>
<w:szCs w:val="36"/>
</w:rPr>
<w:t>BIG_TEXT</w:t>
</w:r>
Run Code Online (Sandbox Code Playgroud)
编辑:我需要在源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
Run Code Online (Sandbox Code Playgroud)
我可以从当前索引+ len(文本)的位置开始新的搜索,但还有另一种方法吗?w例如,元素可以具有一个字符.它将找到w标记文本的索引,但不是索引文本的索引w.
我一直在寻找类似的解决方案(在大型xml文件中索引节点以便快速查找).
lxml只提供源线,这是不够的.Cf API:Original 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2049 次 |
| 最近记录: |