入力として渡されたXML+DTDからファイルを生成するPythonスクリプトを実行していますが、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(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
しかし、私が知る限り、それらは宣言されています...それとも、すべてのマークアップを空のままにしたためでしょうか?
何か案は ?
よろしくお願いします