DTD验证失败(Python)

2024-10-06 07:14:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个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,以及我作为参数传递的XML字符串(xmlDesc)

原始DTD(场景.dtd)

^{pr2}$

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>

最后我得到了这个错误->;ERROR : DTD Validation failed !

另外,我可以在控制台中看到:

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

但据我所知,他们被宣布。。。或者是因为我把所有的加价都空了?在

有什么想法吗?在

谨致问候,谢谢


Tags: nonameconfigfordocparamscriptelement
1条回答
网友
1楼 · 发布于 2024-10-06 07:14:54

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

首先,doctype声明应该与根元素的名称匹配。您有none,但根元素是config_scripts。在

您正在从中加载引用scenario.dtd的内容“场景.dtd". 您应该删除系统标识符。在

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

您还没有定义这些元素:userfull_namepassword,和{}。在

下面是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代码中进行更改。在

相关问题 更多 >