0

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

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

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

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

4

2 回答 2

1

不久前,我尝试做类似的事情,但无法找到解决方案。我终于编写了下面的脚本,它打开 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:])
于 2013-06-17T22:44:00.067 回答
0

你可以尝试用Beautiful Soup解析吗?错误仍然存​​在?

于 2013-06-17T22:32:40.817 回答