[英]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聲明。)
您還沒有定義這些元素: user
, full_name
, password
和groups
。
這是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.