使用python将带有内容的标记添加到现有XML(resx)
我有一个包含许多字符串的XML:使用python将带有内容的标记添加到现有XML(resx),python,xml,resx,Python,Xml,Resx,我有一个包含许多字符串的XML: <?xml version="1.0" encoding="UTF-8"?> <Strings> <String id="TEST_STRING_FROM_XML"> <en>Test string from XML</en> <de>Testzeichenfolge aus XML</de
<?xml version="1.0" encoding="UTF-8"?>
<Strings>
<String id="TEST_STRING_FROM_XML">
<en>Test string from XML</en>
<de>Testzeichenfolge aus XML</de>
<es>Cadena de prueba de XML</es>
<fr>Tester la chaîne à partir de XML</fr>
<it>Stringa di test da XML</it>
<ja>XMLからのテスト文字列</ja>
<ko>XML에서 테스트 문자열</ko>
<nl>Testreeks van XML</nl>
<pl>Łańcuch testowy z XML</pl>
<pt>Cadeia de teste de XML</pt>
<ru>Тестовая строка из XML</ru>
<sv>Teststräng från XML</sv>
<zh-CHS>从XML测试字符串</zh-CHS>
<zh-CHT>從XML測試字符串</zh-CHT>
<Comment>A test string that comes from a shared XML file.</Comment>
</String>
<String id="TEST_STRING_FROM_XML_2">
<en>Another test string from XML.</en>
<de></de>
<es></es>
<fr></fr>
<it></it>
<ja></ja>
<ko></ko>
<nl></nl>
<pl></pl>
<pt></pt>
<ru></ru>
<sv></sv>
<zh-CHS></zh-CHS>
<zh-CHT></zh-CHT>
<Comment>Another test string that comes from a shared XML file.</Comment>
</String>
</Strings>
我将以下XML附加到resx文件的末尾:
<data name="STRING_NAME_2" xml:space="preserve">
<value>This is a value 1</value>
<comment>This is a comment 1</comment>
</data>
</root><?xml version="1.0" ?>
<data name="TEST_STRING_FROM_XML">
<value>Test string from XML</value>
<comment>A test string that comes from a shared XML file.</comment>
</data>
<?xml version="1.0" ?>
<data name="TEST_STRING_FROM_XML_2">
<value>Another test string from XML.</value>
<comment>Another test string that comes from a shared XML file.</comment>
</data>
这是一个值1
这是一条评论1
来自XML的测试字符串
来自共享XML文件的测试字符串。
另一个来自XML的测试字符串。
来自共享XML文件的另一个测试字符串。
即,根结束,然后添加新字符串。关于如何正确地将数据标记添加到现有根目录中,有什么想法吗
以open(resx,“a”)作为输出:
否。不要将XML文件作为文本文件打开。不用于阅读,不用于书写,不用于附加。从来没有
XML文件的典型生命周期为:
- 解析(使用XML解析器)
- 读取或修改(使用DOM API)
- 如果有更改:Serialization(也使用DOM API)
open()
。XML文件不应被视为纯文本。事实并非如此
# parsing
resx = ET.parse(resx_path)
root = resx.getroot()
# modification
for newString in newStrings:
newStringContent = newStrings[newString]
# create node
data = ET.Element("data", name=newString)
ET.SubElement(data, "value").text = newStringContent[0]
ET.SubElement(data, "comment").text = newStringContent[1]
# append node, e.g. to the top level element
root.append(data)
# serialization
resx.write(resx_path, encoding='utf8')
好吧,这似乎奏效了。虽然我在文件的开头丢失了一些特定于resx的格式,但这不是什么大问题。你会如何把它打印出来,而不是把它全部打印成一行呢?我个人的看法是——当你通过DOM API以独占方式读取XML时,文件本身的布局就变得无关紧要了。这毕竟是DOM API的设计目标之一。NET—我想它会在这里使用resx文件—当然一点也不在乎。但现实情况是,许多人想要或需要手动编辑XML,而漂亮的打印就成了一个问题。一些DOM API,如
lxml
,提供内置的漂亮打印支持。其他的,比如Python的ElementTree
并没有提供现成的功能,但是人们已经为此编写了函数。您的代码显示了来自多个源的不加批判的复制粘贴的强烈提示。事实上,你有两个元素树和Minidom在那里是一个死赠品。您不需要2个DOM解析器。扔掉一个。重写依赖于第二个的代码。基本上-重写所有内容,以便您了解它的功能。
<data name="STRING_NAME_2" xml:space="preserve">
<value>This is a value 1</value>
<comment>This is a comment 1</comment>
</data>
</root><?xml version="1.0" ?>
<data name="TEST_STRING_FROM_XML">
<value>Test string from XML</value>
<comment>A test string that comes from a shared XML file.</comment>
</data>
<?xml version="1.0" ?>
<data name="TEST_STRING_FROM_XML_2">
<value>Another test string from XML.</value>
<comment>Another test string that comes from a shared XML file.</comment>
</data>
# parsing
resx = ET.parse(resx_path)
root = resx.getroot()
# modification
for newString in newStrings:
newStringContent = newStrings[newString]
# create node
data = ET.Element("data", name=newString)
ET.SubElement(data, "value").text = newStringContent[0]
ET.SubElement(data, "comment").text = newStringContent[1]
# append node, e.g. to the top level element
root.append(data)
# serialization
resx.write(resx_path, encoding='utf8')