繁体   English   中英

在Python中搜索并替换.xml文件中的一行

[英]Search and replace a line in a .xml file in Python

我需要阅读并替换.xml文件中的一行。 我尝试了几乎所有我可以想象的基于搜索的内容,并替换了Python文件中的一行 ,以及如何使用Python搜索和替换文件中的文本?

然后,作为第二步,我认为可以基于删除文件中的特定行(python) ,以及从Python中的文件中删除行来删除该行并在顶部打印新行。

不幸的是,没有任何事情对我有效。 脚本将所有行写为相同的输出,或者写后格式不正确。

然后,我开始阅读封闭式问题,例如如何使用Python从XML中删除元素,但同样,我并不是试图将其作为最终输出。

更新:偶然地,我删除了一行,并且看不到整个xml代码。

* .xml文件样本:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="gcm.play.android.samples.com.gcmquickstart"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="23" />

    <!-- [START gcm_permission] -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required permission for App measurement to run. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- [END gcm_permission] -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="gcm.play.android.samples.com.gcmquickstart.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

我试图用另一行删除package="gcm.play.android.samples.com.gcmquickstart"行,例如package="another.line"

我正在使用的代码:

def str_replace(file_input, keyword, str_new):
    for line in fileinput.input(file_input, inplace=True):
        line = line.rstrip('\r\n')
        print line.replace(keyword, str_new)
    fileinput.close()
    return

但是它不能正常工作,它只是在行中找到字符串并仅替换字符串。

所需的* .xml文件样本:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sample.different.line"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="23" />

    <!-- [START gcm_permission] -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required permission for App measurement to run. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- [END gcm_permission] -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="gcm.play.android.samples.com.gcmquickstart.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

更新2:感谢Nelson Guaman Leiva,我找到了部分解决我的问题的方法。 我可以设法找到并替换文件特定点上的字符串。 我的新问题是,在pattern=*whatever text here* ,我找不到匹配的方法,我只能找到并替换整个单词,而在等号之后则无法匹配和替换。

基于新解决方案的代码示例:

def find_and_replace(file_input, str_old, str_new):
    with open(file_input, 'r') as fr:
        xml_data = fr.read()
        xml_data = re.sub(r'{}=\"(.+?)\"'.format(str_old), str_new, xml_data)
    fr.closed
    return

更新3:我忘了将过程的编写部分包括在文件中,而代码已包含在文件中。 我不确定此过程是否最快或足以读取和写入,但这是一种可能的解决方案。

代码示例:

def str_replace(self, file_input, str_old, str_new):
        with open(file_input, "r") as fr:
            xml_data = fr.read()
            xml_data = re.sub(r"{}=\"(.+?)\"".format(str_old), str_new, xml_data)
        fr.closed

        with open(file_input, "w") as fw:
            fw.write(xml_data)
        fw.closed

        self.replace_string = xml_data
        return self.replace_string

如果我找到了关于如何匹配并替换package=*whatever here*之后的所有内容的问题的解决方案,因为当前我替换了整行,但至少它能按预期工作。

谢谢您的时间和精力。

您可以使用它为例。

import re
with open ("file.xml", "r") as myfile:
    data = myfile.read()

data = re.sub(r"android:name=\"android\.permission\.[A-Z\_]+", "xxxx", data)
print data

这会将所有android.permission.TEXT替换为xxx。

您只需要替换该字符串即可。

暂无
暂无

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

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