DTD 验证失败 (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)

 <!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>

我终于得到这个错误 -> 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

但据我所知,他们被宣布...或者也许是因为我将所有标记留空?

有什么想法吗?

最好的问候和谢谢

我不确定 Python 代码是否有任何问题,但我可以告诉你你的 DTD 出了什么问题。

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

您在"场景.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 代码中进行这些更改。

最新更新