簡體   English   中英

DTD驗證失敗(Python)

[英]DTD Validation Failing (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 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, 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有什么問題。

首先,您的doctype聲明應與根元素的名稱匹配。 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代碼中進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM