"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
我正在尝试用 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