【问题标题】:Parse XML with multiline attribute使用多行属性解析 XML
【发布时间】:2020-10-13 16:27:31
【问题描述】:

我正在创建一个 python 脚本来修改一个 xml 文件,假设我有这种标签:

<z:row MGFF_SCRIPT='
        If Variabili(&#x22;UFFICIOPA&#x22;) = &#x22;&#x22; Then
            elemento = &#x22;0000000&#x22;
        Else
            elemento = Variabili(&#x22;UFFICIOPA&#x22;)
        End If
        '/>

我需要访问MGFF_SCRIPT属性的值,修改它然后插入到相同的位置;问题是当我获取属性 (Element.get(key)) 的值并将其保存在 py 字符串中时:它没有换行符/缩进,它是单行字符串,因此,当我将修改后的值放入属性中时并创建新的 xml,我将拥有属性 MGFF_SCRIPT,其内容写在一行中。因为内容是脚本,所以这种情况会产生很多问题。 如何解析保留换行符/缩进的属性内容?

【问题讨论】:

  • 属性值中的换行符只是要规范化的空格。它们应该随着符合 DOM 的解析器而消失。您希望通过解析器保留的换行符应使用&amp;#10; 实体进行编码。我不知道是什么创建了该 XML,但它未能进行实体替换。如果您想在 XML 文档中保留间距,这就是 CDATA 部分的用途。

标签: python python-3.x xml parsing lxml


【解决方案1】:

XML 规范中的一条相当不幸的规则是要求 XML 解析器执行 attribute value normalization - 这意味着属性值中的换行符被空格替换。除非你的 XML 解析器有一个选项来抑制这个(而且大多数都没有,因为规范要求它)你才会坚持下去。

【讨论】:

    【解决方案2】:

    正如@tdelaney所说,我们可以先替换它,修改它,然后再恢复它。

    import re
    html =  '''
    <z:row MGFF_SCRIPT='
            If Variabili(&#x22;UFFICIOPA&#x22;) = &#x22;&#x22; Then
                elemento = &#x22;0000000&#x22;
            Else
                elemento = Variabili(&#x22;UFFICIOPA&#x22;)
            End If
            '/>
    '''
    # replace
    blocks = re.compile("'[^']+'").findall(html)
    for block in blocks:
      html = html.replace(block,block.replace('\n','&#10;'))
    print (html)
    
    # restore
    blocks = re.compile("'[^']+'").findall(html)
    for block in blocks:
      html = html.replace(block,block.replace('&#10;','\n'))
    print (html)
    

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 2012-12-10
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多