4

入力として渡された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

しかし、私が知る限り、それらは宣言されています...それとも、すべてのマークアップを空のままにしたためでしょうか?

何か案は ?

よろしくお願いします

4

1 に答える 1

1

Pythonコードに何か問題があるかどうかはわかりませんが、DTDの何が問題なのかはわかります。

まず、Doctype宣言はルート要素の名前と一致する必要があります。あなたは持ってnoneいますが、あなたのルート要素はconfig_scriptsです。

scenario.dtd「scenario.dtd」内から参照してロードしています。システム識別子を削除する必要があります。

xmlには、script定義されていない要素があります。ただし、config_script定義済みなので、XMLまたはDTDのいずれかを変更する必要があります。私の例ではDTDを変更しました。(私はATTLIST宣言も組み合わせました。)

また、次の要素も定義されていません:user、、、、および。full_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コードで行う必要があります。

于 2012-11-15T18:41:33.527 に答える