簡體   English   中英

使用lxml(python)進行xml驗證(DTD)

[英]xml validation(DTD) using lxml(python)

有基於XML驗證的簡要說明這里 我試圖解析一個XML文件,該XML文件引用了嵌套的DTD,即:XML文件引用了一個DTD,它引用了其他DTD。

我得到的錯誤是未定義Config上的命名空間前綴SomeNameSpace。 我要做的就是使用etree.parse解析xml,etree.parse是lxml上的API。 我的問題是:

  1. 我可以關閉驗證功能嗎(我假設xml是正確的)?
  2. 我怎么能為lxml提供所有嵌套的DTD,所以它不會抱怨任何標簽?

我看到類似的問題,但沒有任何答案。

前一段時間,我試圖做類似的事情,但找不到解決方案。 我最終在下面編寫了腳本,該腳本打開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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM