Python 使用多行属性解析XML

Python 使用多行属性解析XML,python,python-3.x,xml,parsing,lxml,Python,Python 3.x,Xml,Parsing,Lxml,我正在创建一个python脚本来修改xml文件,假设我有这样的标记: <z:row MGFF_SCRIPT=' If Variabili(&#x22;UFFICIOPA&#x22;) = &#x22;&#x22; Then elemento = &#x22;0000000&#x22; Else elemento = Variabili(&#x22;UFFI

我正在创建一个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_脚本,它的内容写在单行中。因为内容是脚本,所以这种情况会产生很多问题。
如何解析保留换行符/缩进的属性内容?

在XML规范中,XML解析器需要执行一个非常不幸的规则,这意味着属性值中的换行符被空格替换。除非您的XML解析器有一个选项来禁止此操作(大多数都没有,因为规范要求这样做),否则您只能坚持使用它。

在XML规范中,XML解析器必须执行的规则非常不幸,这意味着属性值中的换行符被空格替换。除非您的XML解析器有一个选项来禁止此操作(大多数都没有,因为规范需要它),否则您将无法使用它。

正如@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)
重新导入
html=“”
'''
#替换
blocks=re.compile(“[^']+”).findall(html)
对于块中的块:
html=html.replace(block,block.replace('\n','
;'))
打印(html)
#恢复
blocks=re.compile(“[^']+”).findall(html)
对于块中的块:
html=html.replace(block,block.replace('
;','\n'))
打印(html)

正如@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)
重新导入
html=“”
'''
#替换
blocks=re.compile(“[^']+”).findall(html)
对于块中的块:
html=html.replace(block,block.replace('\n','
;'))
打印(html)
#恢复
blocks=re.compile(“[^']+”).findall(html)
对于块中的块:
html=html.replace(block,block.replace('
;','\n'))
打印(html)

属性值中的换行符只是要规范化的空白。它们应该在符合DOM的解析器中消失。要通过解析器保存的新行应该使用

实体。我不知道是什么创建了那个XML,但它无法进行实体替换。如果您想在XML文档中保留空格,CDATA节就是为了保留空格。属性值中的换行符只是要规范化的空白。它们应该在符合DOM的解析器中消失。要通过解析器保存的新行应该使用

实体。我不知道是什么创建了那个XML,但它无法进行实体替换。如果您想在XML文档中保留间距,这就是CDATA部分的用途。