【问题标题】:"invalid default value" with lxml and ATTLIST tag带有 lxml 和 ATTLIST 标签的“无效默认值”
【发布时间】:2015-10-09 09:24:51
【问题描述】:

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

你有什么线索吗?

【问题讨论】:

  • 请发布代码并显示您正在使用/调用的lxml 函数
  • 在这里,我通过手动启动opdis 抓取了xml

标签: python parsing lxml


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2018-01-05
    相关资源
    最近更新 更多