2013-08-22 51 views
1

当我公司的系统发生错误时,我收到一封电子邮件。这封电子邮件中包含的XML全部挤在一行上。如何自动关闭截断文件中的xml标签?

我写了一个记事本++ Python脚本,用于解析除XML之外的所有内容,并将它打印出来。不幸的是,一些电子邮件包含太多的XML数据并被截断。一般来说,截断的数据对我来说并不重要。我希望能够自动关闭任何打开的标签,以便我的Python脚本能够正常工作。它不需要很聪明或正确,它只需要使xml足够好以形成脚本运行。有没有办法做到这一点?

我打开Python脚本,在线应用程序,下载的应用程序等

  • 我认识到,正确的解决方案是让未截断XML,但右拉杠杆做事情会比处理它要多得多。
+1

重复[关闭所有打开的xml标签](http://stackoverflow.com/questions/1644994/close-all-opened-xml-tags?rq=1)? – Frank

回答

2

使用Beautiful Soup

>>> import bs4 
>>> s= bs4.BeautifulSoup("<asd><xyz>asd</xyz>") 
>>> s 
<html><head></head><body><asd><xyz>asd</xyz></asd></body></html> 
>> 
>>> s.body.contents[0] 
<asd><xyz>asd</xyz></asd> 

注意,它关闭了 “ASD” 标签自动地”

要创建一个记事本++脚本来处理这个问题,

  • download the tarball并解压缩文件
  • 复制bs4目录到您的PythonScript/scripts文件夹。
  • 在记事本++下面的代码添加到您的Python脚本

 

#import Beautiful Soup 
import bs4 
#get text in document 
text = editor.getText() 
#soupify it to fix XML 
soup = bs4.BeautifulSoup(text) 
#convert soup object to string again 
text = str(soup) 
#clear editor and replace bad xml with fixed xml 
editor.clearAll() 
editor.addText(text) 
#change language to xml 
notepad.menuCommand(MENUCOMMAND.LANG_XML) 
#soup has its own prettify, but I like the XML tools version better 
notepad.runMenuCommand('XML Tools', 'Pretty print (XML only - with line breaks)', 1) 
+0

XML和HTML是不一样的 - 根据正在处理的数据,不指定XML解析器可能会导致数据被错误解释(以及添加示例中显示的cruft)。 –

3

如果您已经安装BeautifulSoup and lxml,这是简单的:

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(""" 
... <?xml version="1.0" encoding="utf-8"?> 
... <a> 
... <b>foo</b> 
... <c>bar</""", "xml") 
>>> soup 
<?xml version="1.0" encoding="utf-8"?> 
<a> 
<b>foo</b> 
<c>bar</c></a> 

注二等"xml"个参数构造函数来避免将XML解释为HTML。