[英]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

something" />
<element value="something
 something" />
这两个都会在生成的 DOM 中给出一个属性值"something\n something"
。
话虽这么说,ElementTree 的实现已损坏,您几乎无能为力。
使用lxml,他们的实现是正确的。
from lxml import etree as ET
value = ET.fromstring('<element value="something
 something" />').attrib['value']
print(value)
# => 'something\n something'
value = ET.fromstring('<element value="something
\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 something"/>'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.