[英]xml validation(DTD) using lxml(python)
有基於XML驗證的簡要說明這里 。 我試圖解析一個XML文件,該XML文件引用了嵌套的DTD,即:XML文件引用了一個DTD,它引用了其他DTD。
我得到的錯誤是未定義Config上的命名空間前綴SomeNameSpace。 我要做的就是使用etree.parse解析xml,etree.parse是lxml上的API。 我的問題是:
我看到類似的問題,但沒有任何答案。
前一段時間,我試圖做類似的事情,但找不到解決方案。 我最終在下面編寫了腳本,該腳本打開XML文件並使用正則表達式查找DTD。 它還有一個替代,可以在命令行上使用DTD路徑,這是我的要求。
如果lxml處理嵌套的DTD,則下面的代碼將為您工作。
老實說,我認為自己讀取文件有點麻煩,但這是我找到的唯一方法。
import re
import sys
import os.path
import codecs
from lxml import etree
def main(args):
if len(args)<1:
print("Not enough arguments given. Expected:")
print("\tvalidatexml <xml file name> [<dtd file name>]\n")
exit(1)
dtdRe = re.compile('.*<!DOCTYPE .* ["\'](.*\.dtd)["\']>.*')
theDtd = None
inFile = args[0]
fdir = os.path.abspath(os.path.dirname(inFile))
if len(args)==2:
theDtd = os.path.abspath(args[1])
else:
with codecs.open(args[0], 'r', 'utf-8') as inf:
for ln in inf:
mtch = dtdRe.match(ln)
if mtch:
if os.path.isabs(mtch.group(1)):
theDtd = mtch.group(1)
else:
theDtd = os.path.abspath(fdir + '/' + mtch.group(1))
break
if theDtd is None:
print("No DTD specified!")
exit(2)
if not os.path.exists(theDtd):
print("The DTD ({}) does not exist!".format(theDtd))
exit(3)
print('Using DTD:', theDtd)
parser = etree.XMLParser(dtd_validation=True)
dtd = etree.DTD(open(theDtd))
tree = etree.parse(args[0])
valid = dtd.validate(tree)
if (valid):
print("XML was valid!")
else:
print("XML was not valid:")
print(dtd.error_log.filter_from_errors())
if __name__ == '__main__':
main(sys.argv[1:])
您可以嘗試通過Beautiful Soup解析嗎? 錯誤仍然存在嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.