在Python中解析包含XML的ASCII文本文件

时间:2018-01-09 04:29:55

标签: python xml file-io

我有一个ASCII文本文件,其中包含XML部分。文件结构如下:

text...
text...
<note1>
   <date>2015-09-01</date>
   <hour>08:30</hour>
   <to>Tove</to>
   <from>Jani</from>
   <body>Don't forget me this weekend!</body>
</note1>
text...
text...
   <note2>
   <date>2015-09-01</date>
   <hour>08:30</hour>
   <to>Tove</to>
   <from>Jani</from>
   <body>Don't forget me this weekend!</body>
</note2>
text...
text...

如何逐步浏览文件并查找XML部分并使用ElementTree,或者更容易将XML部分存储到自己的XML文件中?因此,文件1将为file1.xml,其中包含以下内容:

<note1>
   <date>2015-09-01</date>
   <hour>08:30</hour>
   <to>Tove</to>
   <from>Jani</from>
   <body>Don't forget me this weekend!</body>
</note1>

然后文件2将是file2.xml,其中包含以下内容:

<note2>
   <date>2015-09-01</date>
   <hour>08:30</hour>
   <to>Tove</to>
   <from>Jani</from>
   <body>Don't forget me this weekend!</body>
</note2>

2 个答案:

答案 0 :(得分:1)

天真的做法就是这样......

首先,使用内置python file handler打开文件。这将允许您读取,写入和创建新的文本文件。您只需要命名新文件SELECT Z.NAME, CASE WHEN Z.CONSEQ_AVAIL >= 3 THEN 1 ELSE 0 END AS YOUR_FLAG FROM ( SELECT A.NAME, SUM(CASE WHEN B.ADATE >= A.ADATE AND B.ADATE <= A.ADATE + 2 THEN 1 ELSE 0 END) AS CONSEQ_AVAIL FROM TABL_A A INNER JOIN TABL_A B ON A.NAME = B.NAME AND A.AVAILABLE = 'Y' AND B.AVAILABLE = 'Y' GROUP BY A.NAME ) Z; 以将其另存为xml文件。

其次,您逐行遍历目标文件并搜索file#.xml xml代码的开头。您还需要存储标记中包含的字符串的值。当您从这里开始时,您开始将每一行写入新的xml文件。然后,每次在文件中找到<>时,都会检查发起搜索的字符串值。您可能还想验证是否有结束标记指示符<>。一旦你点击结束标记并添加它,你就完成了第一个xml文件。

您继续搜索/并基本上重复第二步并创建一个新的xml文件。您对整个输入文件执行此操作。

这种天真实现的缺点是,如果您的普通文本包含一组<>,则可能会导致错误。还必须很好地形成每个文件的初始和最终xml标记。

我认为不需要将xml数据存储在<>中。

答案 1 :(得分:1)

BeautifulSoup可以很好地处理格式错误的XML。在这里你可以做到:

from bs4 import BeautifulSoup

with open(textfilename) as fd:
    soup = BeautifulSoup(fd)

n1 = soup.findChild()         # extract first full XML element, here <node1>...</node1>
while n1:
    # process the XML element
    ...
    n1 = n1.findNextSibling() # extract next full XML element