【问题标题】:Python XML modifying by ElementTree destroys the XML structureElementTree 修改 Python XML 破坏了 XML 结构
【发布时间】:2016-10-06 07:37:54
【问题描述】:

我在 windows 框架上使用 Python V 3.5.1 来修改里面的文本,修改效果很好,但是在保存树后,所有空标签都会被破坏,如下例所示:

<HOSTNAME></HOSTNAME> Is being changed to <HOSTNAME />

标签之间有文字的孩子看起来不错:

<HOSTNAME>tnas2</HOSTNAME> is being changed to 
<HOSTNAME>tnas2</HOSTNAME> which is the same as the source.

源 XML 文件是:

<ROOT>

    <DeletedName>

        <VERIFY_DEST_SIZE>Y</VERIFY_DEST_SIZE>

        <VERIFY_BYTES>Y</VERIFY_BYTES>

        <TIMESTAMP>XXXXXXXXXDeletedXXXXXXXXXX</TIMESTAMP>

        <EM_USERS>XXXXXXXXXDeletedXXXXXXXXXX</EM_USERS>

        <EM_GROUPS></EM_GROUPS>

        <LOCAL>

            <HOSTNAME></HOSTNAME>

            <PORT></PORT>

            <USERNAME>XXXXXXXXXDeletedXXXXXXXXXX</USERNAME>

            <PASSWORD>XXXXXXXXXDeletedXXXXXXXXXX</PASSWORD>

            <HOME_DIR></HOME_DIR>

            <OS_TYPE>Windows</OS_TYPE>

        </LOCAL>

        <REMOTE>

            <HOSTNAME>DeletedHostName</HOSTNAME>

            <PORT>22</PORT>

            <USERNAME>XXXXXXXXXDeletedXXXXXXXXXX</USERNAME>

            <PASSWORD>XXXXXXXXXDeletedXXXXXXXXXX</PASSWORD>

            <HOME_DIR>XXXXXXXXXDeletedXXXXXXXXXX</HOME_DIR>

            <OS_TYPE>Unix</OS_TYPE>

            <CHAR_SET>UTF-8</CHAR_SET>

            <SFTP>Y</SFTP>

            <ENCRYPTION>Blowfish</ENCRYPTION>

            <COMPRESSION>N</COMPRESSION>

        </REMOTE>

    </DeletedName>

</ROOT>

代码是:

import os
import xml.etree.ElementTree as ET
from shutil import copyfile
import datetime

def AddAuthUserToAccountsFile(AccountsFile,RemoteMachine,UserToAdd):
    today = datetime.date.today()
    today = str(today)
    print(today)
    BackUpAccountsFile = AccountsFile + "-" + today
    try:
        tree = ET.parse(AccountsFile)
    except:
        pass
    try:
        copyfile(AccountsFile,BackUpAccountsFile)
    except:
        pass
    root = tree.getroot()
    UsersTags = tree.findall('.//EM_USERS')
    for UsersList in UsersTags:
        Users = UsersList.text
        Users = UsersList.text = Users.replace("||","|")
        if UserToAdd not in Users:
            print("The Users were : ",Users, "--->> Adding ",UserToAdd)
            UsersList.text = Users + UserToAdd +"|"
    tree.write(AccountsFile)

感谢任何帮助以通过这种奇怪的情况。

谢谢, 三木

【问题讨论】:

  • &lt;HOSTNAME&gt;&lt;/HOSTNAME&gt;&lt;HOSTNAME/&gt; 完全相同
  • 是的,但我的应用程序无法读取它,它会在标签内部查找,因此如果没有打开标签和关闭标签,它就无法读取它。
  • 那么您在编写应用程序时犯了一个大错误。
  • 不幸的是,它不是我的,它是 Control-M,BMC 著名的生产调度程序。我必须以某种方式处理这个问题,当标签不为空时是否有机会保持结构不变?
  • 我不知道那是什么,但你应该提出支持请求。

标签: python xml elementtree


【解决方案1】:

好的,我找到了解决方案 - 只需将 method = "html" 添加到 tree.write 行,它会根据需要保留它。

tree.write(AccountsFile,method = 'html')

谢谢。

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多