我尝试使用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!
你有任何线索吗?
答案 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