Python XML 解析器破坏 AndroidManifest.xml
我正在尝试解析一个Android项目中的AndroidManifest.xml文件,以便在构建时程序化地更改其中的一些值。(使用xml.dom.minidom)
不幸的是,解析器输出了格式不正确的XML(即使我对从XML输入构建的DOM没有做任何更改)
这是一个非常简单的AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.npike.android.sampleapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="net.npike.android.sampleapp.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>
</application>
</manifest>
这是我非常简单的Python脚本,它只是加载文件,解析它,然后再写回去:
#!/usr/bin/python
import os
from xml.dom.minidom import parse
dom1 = parse("AndroidManifest.xml")
f = os.open("AndroidManifest.xml", os.O_RDWR)
os.write( f, dom1.toxml() )
不幸的是,在运行这个脚本处理上面提到的AndroidManifest后,写入磁盘的输出是:
<?xml version="1.0" ?><manifest android:versionCode="1" android:versionName="1.0" package="net.npike.android.sampleapp" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17"/>
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
<activity android:label="@string/app_name" android:name="net.npike.android.sampleapp.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>tent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是怎么回事呢?有没有更好的方法在Python中解析AndroidManifest?
补充说明:我可能应该加一句,格式不正确的部分是从第一个标签之后的所有内容。
2 个回答
1
如果你想用Python来解析XML文件,可以直接使用etree
这个工具:
import xml.etree.ElementTree as etree
etree.register_namespace('android', 'http://schemas.android.com/apk/res/android')
with open('AndroidManifest.xml', 'r') as handle:
root = etree.parse(handle)
root.find('application').set('android:allowBackup', 'false')
root.write('parsed.xml', encoding='utf-8', xml_declaration=True)
这个语法很简单易懂,而且它是Python自带的库,所以你不需要额外安装什么,直接就能用。
0
看起来这是因为输出的内容比输入的内容短,所以它没有覆盖整个内容。
你试过把内容写到另一个文件里吗?