繁体   English   中英

编辑 XML 文件而不忽略属性值中的空格

[英]Editing XML file without ignoring whitespaces in attributes values

我想用另一个 xml 文件的值更新一个 xml 文件。 解析后它工作正常,但我对指定的属性值有一个问题。 解析 XML 文件后,每个空格都会被忽略,例如,如果

value='something

something'

它将更改为value='something something'而我的文件不能那样。

有一张图片以某种方式显示了我所关心的:

图片

我想用不止一行来保留这些值。 据我所知,解析 xml 文件会破坏原始文件的结构,但是有没有什么简单的方法可以修复我的程序,这样它就会以某种方式避免忽略空格?

这是我的代码:

import xml.etree.ElementTree as ET

Mainfile = 'Mainfile_1.xml'
tree = ET.parse(Mainfile)
root = tree.getroot()
fixfile = 'fixfile_1.xml'
tree2 = ET.parse(fixfile)
root2 = tree2.getroot()
for objects in root.iter('object'):
    objid = objects.attrib.get('id')
    for attributes in objects.getchildren():
        name = attributes.attrib.get('name')
        value = attributes.attrib.get('value')
        if value == 'FAIL':
            for objects2 in root2.iter('object'):
                objid2 = objects2.attrib.get('id')
                for attributes2 in objects2.getchildren():
                    name2 = attributes2.attrib.get('name')
                    value2 = attributes2.attrib.get('value')
                    if objid2 == objid:
                        if name == name2:
                            attributes.set('value', value2)

tree.write('Mainfile_1updated.xml',xml_declaration=True, encoding='UTF-8')

这是 MainXML:

<?xml version='1.0' encoding='UTF-8'?>
<Module bs='Mainfile_1'>
<object name='namex' number='1' id='1000'>
    <item name='item0' value='100'/>
    <item name='item00' value='100'/>
</object>
<object name='namey' number='2' id='1001'>
    <item name='item1' value='100'/>
    <item name='item00' value='100'/>
</object>
<object name='name1' number='3' id='1234'>
    <item name='item1' value='FAIL'/>
    <item name='item2' value='233
    
    233'/>
    <item name='item3' value='233'/>
    <item name='item4' value='FAIL'/>
</object>
<object name='name2' number='4' id='1238'>
    <item name='item8' value='FAIL'/>
    <item name='item9' value='233'/>
</object>
<object name='name32' number='5' id='2345'>
    <item name='item1' value='111'/>
    <item name='item2' value='FAIL'/>
</object>
<object name='name4' number='6' id='2347'>
    <item name='item1' value='FAIL'/>
    <item name='item2' value='FAIL'/>
    <item name='item3' value='233'/>
    <item name='item4' value='FAIL'/>
</object>
</Module>

这是修复文件:

<?xml version='1.0' encoding='UTF-8'?>
<Module bs='Mainfile_1'>
<object id='1234'>
    <item name='item1' value='something
something111'/>
    <item name='item4' value='something
1something'/>
</object>
<object id='1238'>
    <item name='item8' value='something12
1something'/>
</object>
<object id='2345'>
    <item name='item2' value='something
12something'/>
</object>
<object id='2347'>
    <item name='item1' value='something14
13of something'/>
    <item name='item2' value='something
11something'/>
    <item name='item4' value='something14
something14
something12
13something'/>
</object>
</Module>

“它将更改为value='something something'而我的文件不能是那样的。*

那么你必须停止使用那样的属性。 解析 XML 文件时,属性值内的换行字符将被规范化为空格。 您可以打开文本编辑器并生成 XML,如下所示:

<element value="something
something" />

但是在解析时,这将变成等同于

<element value="something something" />

这就是它的工作原理。

如果你想在属性值中存储制表符或换行符之类的东西,你必须明确地转义它们。 然后在解析文档时将保留它们:

<element value="something&#xA;
something" />

<element value="something&#xA; something" />

这两个都会在生成的 DOM 中给出一个属性值"something\n something"


话虽这么说,ElementTree 的实现已损坏,您几乎无能为力。

使用lxml,他们的实现是正确的。

from lxml import etree as ET

value = ET.fromstring('<element value="something&#xA; something" />').attrib['value']
print(value)
# => 'something\n something'

value = ET.fromstring('<element value="something&#xA;\nsomething" />').attrib['value']
print(value)
# => 'something\n something'

elem = ET.fromstring('<element />')
elem.attrib['value'] = 'something\n something'
xml = ET.tostring(elem)
print(xml)
# => b'<element value="something&#10; something"/>'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM