"invalid default value" 带有 lxml 和 ATTLIST 标签

"invalid default value" with lxml and ATTLIST tag

我正在尝试用 lxml 解析 XML 文件(由 opdis 提供);它在这一行失败:

<!ATTLIST operand type (target|src|dest) "">

它说:Attribute operand of type: invalid default value

问题出在标签末尾的""。如果我用 "nothing" 之类的东西填充它,它就可以正常工作。 lxml 只是不喜欢空字符串。

问题是我不能编辑 XML,它必须由 opdis 动态生成,所以我必须想办法让 lxml 忽略这个错误.

代码如下:

xml = subprocess.Popen(["opdis", "-f", "xml", "-E", "/home/ubuntu/workspace/testbinaries/bin/acc"], stdout=subprocess.PIPE).stdout.read();
tree = etree.fromstring(xml); #FAIL!

你有什么线索吗?

有问题的线路

<!ATTLIST operand type (target|src|dest) "">

operand 属性的 DTD attribute declaration。根据规范:

AttlistDecl    ::=      '<!ATTLIST' S Name AttDef* S? '>'
AttDef         ::=      S Name S AttType S DefaultDecl

空串对应DefaultDecl,属性的默认值(而S对应一个白色的space)。

default value 应该定义为:

DefaultDecl    ::=      '#REQUIRED' | '#IMPLIED'
            | (('#FIXED' S)? AttValue)  [VC: Required Attribute]
            [VC: Attribute Default Value Syntactically Correct]
            [WFC: No < in Attribute Values]
            [VC: Fixed Attribute Default]
            [WFC: No External Entity References]

所以它不能是空字符串,lxml 正在做他的工作。

您必须向 opdis 邮件列表提交新问题。您也可以在代码中设置自己的值 #REQUIRED#IMPLIED 来更正问题:

xml  = subprocess.Popen(["opdis", "-f", "xml", "-E", "/home/ubuntu/workspace/testbinaries/bin/acc"], stdout=subprocess.PIPE).stdout.read();
xml  = xml.replace("\"\"","#REQUIRED")
tree = etree.fromstring(xml); #OK