python - DTD 验证失败(Python)

标签 python xml dtd libxml2

我正在编写一个 Python 脚本,该脚本从作为输入传递的 XML + DTD 生成文件,但它失败了,因为无法验证 DTD,而我“在视觉上”看不到任何问题。

这是我的代码:

DTD = 'scenario.dtd'

def OpenXML(xmlDesc):
    dtd = libxml2.parseDTD(None,DTD)
    ctxt = libxml2.newValidCtxt()
    doc = libxml2.parseDoc(xmlDesc)

    frags = doc.xpathEval('/scenario/config_script/param/*')
    for frag in frags:
        frag.unlinkNode()   # We remove children of param for validation

    if doc.validateDtd(ctxt, dtd) != 1:
        print "ERROR : DTD Validation failed ! "
        sys.exit()

    doc.freeDoc()
    dtd.freeDtd()

    return libxml2.parseFile(xmlDesc)

这里是 DTD,以及我作为参数 (xmlDesc) 传递的 XML 字符串

原始 DTD (scenario.dtd)

 <!ELEMENT scenario (name, description, config_script*)>
 <!ELEMENT name (#PCDATA)>
 <!ELEMENT description (#PCDATA)>
 <!ELEMENT config_script (param)>
 <!ELEMENT param ANY>

 <!ATTLIST scenario target (win32|win64|linux32|linux64) "win32">
 <!ATTLIST config_script name CDATA #REQUIRED>
 <!ATTLIST config_script repository CDATA #REQUIRED>

dtd 变量的值(函数的第一行)

<!DOCTYPE none SYSTEM "scenario.dtd" [
 <!ELEMENT scenario (name, description, config_script*)>
 <!ELEMENT name (#PCDATA)>
 <!ELEMENT description (#PCDATA)>
 <!ELEMENT config_script (param)>
 <!ELEMENT param ANY>

 <!ATTLIST scenario target (win32|win64|linux32|linux64) "win32">
 <!ATTLIST config_script name CDATA #REQUIRED>
 <!ATTLIST config_script repository CDATA #REQUIRED>

]>

xml(对我来说,所有内容都在同一行,但为了便于阅读,我换行了)

<config_scripts>
    <script name="reset" repository="config_os">
        <param>
            <user>
                <name/>
                <full_name/>
                <password/>
                <groups/>
            </user>
        </param>
    </script>
</config_scripts>

我终于得到了这个错误 -> 错误:DTD 验证失败!

另外,我可以在控制台中阅读:

No declaration for element config_script
No declaration for element script
No declaration for attribute name of element script
No declaration for attribute repository of element script
No declaration for element user 
No declaration for element full_name
No declaration for element password
No declaration for element groups

但据我所知,它们已被声明...或者可能是因为我将所有标记都留空了?

有什么想法吗?

致以最诚挚的问候和感谢

最佳答案

我不确定 Python 代码是否有问题,但我可以告诉您 DTD 有什么问题。

首先,您的文档类型声明应该与您的根元素的名称相匹配。你有 none 但你的根元素是 config_scripts

您在“scenario.dtd”中指定了 scenario.dtd。您应该删除系统标识符。

在您的 xml 中,您有一个未定义的 script 元素。您确实定义了 config_script,因此需要更改 XML 或 DTD。我在示例中更改了 DTD。 (我还结合了 ATTLIST 声明。)

您也没有定义这些元素:userfull_namepasswordgroups

DTD 应如下所示(不对 XML 进行任何修改):

<!DOCTYPE config_scripts [
<!ELEMENT scenario (name, description, config_script*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT config_scripts (script)>

<!ELEMENT script (param)>
<!ATTLIST script 
           name CDATA #REQUIRED
           repository CDATA #REQUIRED> 

<!ELEMENT param ANY>

<!ELEMENT user (name,full_name,password,groups)>
<!ELEMENT full_name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT groups (#PCDATA)>

<!ATTLIST scenario target (win32|win64|linux32|linux64) "win32">
]>

XML 在 oXygen 中根据此 DTD 进行验证,因此如果需要进行任何其他更改,它们很可能需要在 Python 代码中进行。

关于python - DTD 验证失败(Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13400601/

相关文章:

python - 如何使用 tkinter Canvas 小部件制作按钮?

python - python numba中非常大的整数

python - 对稀疏矩阵求指数

python - 如何在 sympy 中创建符号变量向量

xml - DTD 中的 % 是什么意思?

java - 如何使用 SAX 初始化 JAXB

python - 如何将 python 单元测试框架文件的输出写入 .xml 文件以在 jenkins 上可视化?

c# - 如何在 C# 中验证数字签名的 XML 文档?

java - 尝试读取 DTD 文件的非验证 DocumentBuilder