【问题标题】:xml validation(DTD) using lxml(python)使用 lxml(python)的 xml 验证(DTD)
【发布时间】:2013-06-18 12:54:20
【问题描述】:

有一个基于 XML 的验证的简要说明here。我正在尝试解析引用嵌套 DTD 的 XML 文件,即:XML 文件引用 DTD,它引用其他 DTD。

我得到的错误是名称空间前缀 SomeNameSpace on Config 未定义。 我要做的就是使用 etree.parse 解析 xml,它是 lxml 上的一个 API。 我的问题是:

  1. 我可以关闭验证吗(我假设 xml 是正确的)?
  2. 我如何准确地提供 lxml 所有嵌套的 DTD,这样它就不会抱怨任何标签?

我看到了类似的问题,但没有任何东西可以回答这个问题。

【问题讨论】:

    标签: python xml lxml dtd


    【解决方案1】:

    不久前,我尝试做类似的事情,但无法找到解决方案。我终于编写了下面的脚本,它打开 XML 文件并使用正则表达式查找 DTD。它还具有在命令行上采用 DTD 路径的覆盖,这是我的要求。

    如果 lxml 处理嵌套的 DTD,那么下面的代码应该适合你。

    老实说,我认为自己读取文件有点像 hack,但这是我找到的唯一方法。

    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:])
    

    【讨论】:

      【解决方案2】:

      您可以尝试通过Beautiful Soup 解析吗?错误仍然存​​在?

      【讨论】:

        猜你喜欢
        • 2014-04-18
        • 2011-04-21
        • 2016-09-18
        • 2011-11-17
        • 1970-01-01
        • 2011-09-30
        • 2016-04-01
        • 2010-11-22
        相关资源
        最近更新 更多