使用python将带有内容的标记添加到现有XML(resx)

使用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:

<?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)
在任何时候都不应该对XML文件调用
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')