"无效的默认值"使用lxml和ATTLIST标记

时间:2015-10-09 09:24:51

标签: python parsing lxml

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

<!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!

你有任何线索吗?

1 个答案:

答案 0 :(得分:1)

有问题的一行

<!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对应一个空格)。

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