我有一个 XML 文件,其中包含 100 多个文档。每个 block 看起来像这样:
<DOC>
<DOCNO> FR940104-2-00001 </DOCNO>
<PARENT> FR940104-2-00001 </PARENT>
<TEXT>
<!-- PJG FTAG 4703 -->
<!-- PJG STAG 4703 -->
<!-- PJG ITAG l=90 g=1 f=1 -->
<!-- PJG /ITAG -->
<!-- PJG ITAG l=90 g=1 f=4 -->
Federal Register
<!-- PJG /ITAG -->
<!-- PJG ITAG l=90 g=1 f=1 -->
/ Vol. 59, No. 2 / Tuesday, January 4, 1994 / Notices
<!-- PJG 0012 frnewline -->
<!-- PJG /ITAG -->
<!-- PJG ITAG l=01 g=1 f=1 -->
Vol. 59, No. 2
<!-- PJG 0012 frnewline -->
<!-- PJG /ITAG -->
<!-- PJG ITAG l=02 g=1 f=1 -->
Tuesday, January 4, 1994
<!-- PJG 0012 frnewline -->
<!-- PJG 0012 frnewline -->
<!-- PJG /ITAG -->
<!-- PJG /STAG -->
<!-- PJG /FTAG -->
</TEXT>
</DOC>
我想将此 XML 文档加载到字典 Text 中。 Key 作为 DOCNO & Value 作为标签内的文本。此外,该文本不应包含所有评论。示例 Text['FR940104-2-00001'] 必须包含 Federal Register/Vol. 59,第 2 期/1994 年 1 月 4 日,星期二/通知卷。 59,第 2 号星期二,1994 年 1 月 4 日。这是我写的代码。
L = doc.getElementsByTagName("DOCNO")
for node2 in L:
for node3 in node2.childNodes:
if node3.nodeType == Node.TEXT_NODE:
docno.append(node3.data);
#print node2.data
L = doc.getElementsByTagName("TEXT")
i = 0
for node2 in L:
for node3 in node2.childNodes:
if node3.nodeType == Node.TEXT_NODE:
Text[docno[i]] = node3.data
i = i+1
令人惊讶的是,在我的代码中,我得到了 Text['FR940104-2-00001'] as u'\n' 怎么会呢?如何得到我想要的
请您参考如下方法:
您可以通过使用 xml.sax.handler 来避免循环遍历文档两次:
import xml.sax.handler
import collections
class DocBuilder(xml.sax.handler.ContentHandler):
def __init__(self):
self.state=''
self.docno=''
self.text=collections.defaultdict(list)
def startElement(self, name, attrs):
self.state=name
def endElement(self, name):
if name==u'TEXT':
self.docno=''
def characters(self,content):
content=content.strip()
if content:
if self.state==u'DOCNO':
self.docno+=content
elif self.state==u'TEXT':
if content:
self.text[self.docno].append(content)
with open('test.xml') as f:
data=f.read()
builder = DocBuilder()
xml.sax.parseString(data, builder)
for key,value in builder.text.iteritems():
print('{k}: {v}'.format(k=key,v=' '.join(value)))
# FR940104-2-00001: Federal Register / Vol. 59, No. 2 / Tuesday, January 4, 1994 / Notices Vol. 59, No. 2 Tuesday, January 4, 1994
