2017-04-18 146 views
0

我试图处理具有下列结构的文件:Python的 - 解析其中包含多个XML部分文件

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <!DOCTYPE doc SYSTEM "djnml-1.0b.dtd"> 
    <doc msize="000007622" md5="235d6d9aa0071dd0bd711e812ff918fc" sysId="sbknwsarchp01" destination="AW" distId=" " transmission-date="    " > 
    <djnml publisher="DJN" docdate="20160301" product="DN" seq="4" xml:lang="en-us" > 
    <head> 
    <copyright year="2016" holder="text" ></copyright> 
    <docdata> 
    <djn> 
    <djn-newswires news-source="DJDN" origin="DJ" service-id="CO" > 
    <djn-press-cutout/> 
    <djn-urgency>0</djn-urgency> 
    <djn-mdata brand="DJ" temp-perm="P" retention="N" hot="N" original-source="DJCS" accession-number="20160301000004" page-citation="" display-date="20160301T050006.315Z" > 
    <djn-coding> 
    <djn-government> 
    <c>G/AGD</c> 
    <c>G/USG</c> 
    </djn-government> 
    <djn-page> 
    <c>70180</c> 
    <c>83567</c> 
    </djn-page> 
    <djn-subject> 
    <c>N/DJAG</c> 
    <c>N/DJCS</c> 
    </djn-subject> 
    <djn-market> 
    <c>M/MMR</c> 
    </djn-market> 
    <djn-product> 
    <c>P/ACMD</c> 
    <c>P/FNVW</c> 
    </djn-product> 
    <djn-geo> 
    <c>R/NME</c> 
    <c>R/TN</c> 
    </djn-geo> 
    </djn-coding> 
    </djn-mdata> 
    </djn-newswires> 
    </djn> 
    </docdata> 
    </head> 
    <body> 
    <headline brand-display="DJ" > 
    text</headline> 
    <text> 
    <pre> 
    text 
    </pre> 
    <p> 
     text</p> 
    <p> 
     text</p> 
    </text> 
    </body> 
    </djnml> 
    </doc> 
<?xml version="1.0" encoding="iso-8859-1" ?> 
<!DOCTYPE doc SYSTEM "djnml-1.0b.dtd"> 
<doc msize="000002698" md5="81b0dd0339b8c77febf46ebdaf8ef617" sysId="sbknwsarchp01" destination="AW" distId=" " transmission-date="    " > 
<djnml publisher="DJN" docdate="20160301" product="DN" seq="70" xml:lang="en-us" > 
<head> 
<copyright year="2016" holder="text" ></copyright> 
<docdata> 
<djn> 
<djn-newswires news-source="DJDN" origin="DJ" service-id="CO" > 
<djn-press-cutout/> 
<djn-urgency>0</djn-urgency> 
<djn-mdata brand="DJ" temp-perm="P" retention="N" hot="N" original-source="FW" accession-number="20160301000070" page-citation="" display-date="20160301T052632.174Z" > 
<djn-coding> 
<djn-company> 
<c>ANZ.AU</c> 
<c>ANZ.NZ</c> 
<c>ANZBY</c> 
</djn-company> 
<djn-isin> 
<c>AU000000ANZ3</c> 
<c>US0525283042</c> 
</djn-isin> 
<djn-industry> 
<c>I/BAN</c> 
<c>I/BKS</c> 
</djn-industry> 
<djn-page> 
<c>22767</c> 
<c>5014</c> 
<c>55115</c> 
</djn-page> 
<djn-subject> 
<c>N/AER</c> 
<c>N/BKG</c> 
</djn-subject> 
<djn-market> 
<c>M/FCL</c> 
<c>M/NND</c> 
</djn-market> 
<djn-product> 
<c>P/ABO</c> 
<c>P/AEI</c> 
</djn-product> 
<djn-geo> 
<c>R/ASA</c> 
<c>R/FE</c> 
</djn-geo> 
</djn-coding> 
</djn-mdata> 
</djn-newswires> 
</djn> 
</docdata> 
</head> 
<body> 
<headline brand-display="DJ" > 
text</headline> 
<text> 
<pre> 
</pre> 
<p> 
    text </p> 
<pre> 

Editor JSM 

</pre> 
<p> 
    text</p> 
<p> 
    text</p> 
</text> 
</body> 
</djnml> 
</doc> 

即该文件包含许多较小的“xml”部分。

我想下面的代码:

import xml.etree.ElementTree as ET 
tree = ET.parse('test.nml') 
root = tree.getroot() 
print(root.iter('djn-subject')) 
for element_1 in root.iter('djn-subject'): 
    for element_2 in root.iter('c'): 
     print(element_2.text) 

它给出了一个错误

File "<string>", line unknown 
ParseError: junk after document element: line 195, column 0 

任何想法,我怎么能摆脱这种错误的?看起来我的XML文件有多个根,有没有办法绕过根或其他方式来处理这个问题?谢谢。

+0

您是否尝试将文件分解为基于xml开始标记的片段?在第一组中阅读应该很容易,然后回去休息。 – Chris

+0

请参阅[我的以前的答案](http://stackoverflow.com/a/41176663/8747),该函数使用ElementTree将多个XML文档从单个文件中分离出来。 –

+1

*看起来我的XML文件有多个根* ...按照W3C标准,这个标记不是一个XML文件。根据定义,XML格式良好,因此像Python的''etree''这样的符合标准的库应该会出错。找到这个标记的来源,无论是软件,供应商还是程序员,并在继续开发工作之前解决这个问题。 – Parfait

回答

0

XML etree只需要一个根节点。如果你有多个根,它不会解析它,你会得到一个像你看到的错误,因为它读取的形式很差的XML。您需要编辑您的XML文件,以便您尝试检索的所有元素都在一个单一的根节点下,或者您必须将每个根节点分成多个文件并分别进行解析(这不是最高效的,但它取决于您的名称空间和xsd是相同还是不同)。