Skip to main content
 首页 » 编程设计

python之帮助在 Python 中解析 XML

2025年05月04日14wayfarer

我有一个 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