2010-09-01 59 views
1

我正嘗試創建一個簡單的XML解析器,其中每個不同的XML架構都有自己的解析器類,但我無法弄清楚最佳方式。我實際上希望做的是這樣的:用於XML解析的Python元編程

in = sys.stdin 
xmldoc = minidom.parse(in).documentElement 

xmlParser = xmldoc.nodeName 
parser = xmlParser() 
out = parser.parse(xmldoc) 

我不還十分肯定,如果我正確地獲取文檔根名稱,但是這想法:創建具有相似名稱的類的對象到文檔根目錄並使用該類中的parse()函數來解析和處理輸入。

什麼是最簡單的方法來實現這一目標?我一直在閱讀關於自省和模板,但還沒有能夠解決這個問題。我過去曾用Java做過類似的事情,而且AFAIK也使得這一點變得簡單。 python的方式是什麼?

+1

這個問題沒有細節就毫無價值。通過「解析」,你的意思是「從DOM中提取數據」?或者你想從頭開始構建一個完整的XML解析器?或者你的意思是*驗證器*? ...? – delnan 2010-09-01 13:51:08

+0

這將如何相關?我希望能夠基於XML文件的文檔根名稱來調用Python類。我不認爲這與我在這些課程中要做什麼有關。 – Makis 2010-09-01 16:39:58

回答

1

正如Mark在他的評論中指出的,爲了獲得對運行時名稱的類的引用,可以使用getattr。

doc = minidom.parse(sys.stdin) 
# is equivalent to 
doc = getattr(minidom, "parse")(sys.stdin) 

下面是您的僞代碼的更正版本。

from xml.dom import minidom 
import sys 
import myParsers # a module containing your parsers 

xmldoc = minidom.parse(sys.stdin).documentElement 

myParserName = xmldoc.nodeName 
myParserClass = getattr(myParsers, myParserName) 
# create an instance of myParserClass by calling it with the documentElement 
parser = myParserClass(xmldoc) 
# do whatever you want with the instance of your parser class 
output = parser.generateOutput() 

GETATTR將返回一個AttributeError如果屬性不存在,那麼你可以用在調用一個try ... except或傳遞第三個參數於getattr,至極將返回如果屬性ISN」找到了。

1

我想大多數python程序員只會用lxml來解析他們的xml。如果你仍然想在課堂上包裝它,但是正如delnan在他的評論中所說的那樣,你的意思有點不清楚。

from lxml import etree 

tree = etree.parse('my_doc.xml') 
for element in tree.getroot(): 
    ... 

一對夫婦的旁註,如果其他的程序員將要閱讀你的代碼,你應該嘗試至少大致遵循PEP 8。更重要的是,你真的不應該分配給像建宏「,在「。

+0

這只是一個簡單的測試服務器,其中此腳本接收XML文件並返回一些內容。我認爲我會更聰明一點,以便可以輕鬆地爲每個模式接收到的xml(有效性檢查等)添加更多的測試(即,我可以檢查xml文件是否正確)。我的計劃是讓解析器以根文檔命名,但這超出了我的觀點,因爲我對我的問題的反思/反思部分更感興趣。即如果我們將對象的名稱作爲字符串,是否可以創建一個對象? – Makis 2010-09-02 05:30:34

+0

那麼,如果你知道它的名字,就很容易實例化一個現有的類。你可以使用parser_class = getattr(module,class_name)。我認爲這是你要求的。如果你想動態生成一個基於字符串名稱的類,你可以實際做到這一點,但我不認爲這就是你想要的。 – Mark 2010-09-02 14:49:36