0

ビルド時にその値の一部をプログラムで変更するために、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 を解析するためのより良い方法はありますか?

編集:おそらく、不正な部分は最初のタグの後のすべてであることを追加する必要があります。

4

2 に答える 2

1

XML を Python で解析したい場合は、以下を使用して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)

構文は理解でき、標準ライブラリに含まれており、機能します。

于 2013-02-27T02:00:29.367 に答える
0

これは、出力が入力よりも短いため、全体が上書きされていないように見えます。

別のファイルに書き出してみましたか?

于 2013-02-27T02:05:13.563 に答える