加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

DTD验证失败(Python)

发布时间:2020-12-20 13:31:17 所属栏目:Python 来源:网络整理
导读:我正在做一个 Python脚本,它从作为输入传递的XML DTD生成文件,但它失败了,因为无法验证DTD,而我没有“直观地”看到任何问题. 这是我的代码: DTD = 'scenario.dtd'def OpenXML(xmlDesc): dtd = libxml2.parseDTD(None,DTD) ctxt = libxml2.newValidCtxt() do
我正在做一个 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 String作为参数(xmlDesc)

原始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变量的值(函数的第1行)

<!DOCTYPE none SYSTEM "scenario.dtd" [
 <!ELEMENT scenario (name,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有什么问题.

首先,您的doctype声明应与根元素的名称匹配.你没有,但你的根元素是config_scripts.

您正在加载“scenario.dtd”中的scenario.dtd.您应该删除系统标识符.

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

您还没有定义这些元素:user,full_name,password和groups.

这是DTD应该是什么样的(没有对XML进行任何修改):

<!DOCTYPE config_scripts [
<!ELEMENT scenario (name,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,password,groups)>
<!ELEMENT full_name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT groups (#PCDATA)>

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

XML在oXygen中对此DTD进行验证,因此如果需要进行任何其他更改,则很可能需要在Python代码中进行更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读