2013-08-22 73 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。