使用 JDOM2 解析 android 清单文件
parsing an android manifest file with JDOM2
希望你一切都好。
我必须解析一个 android 清单文件来提取像 'the minSdkVersion' 这样的数据,经过几次搜索后我发现了一个使用 JDOM 的代码。
显示与 "uses-sdk" 相关的数据是预期的,但是当 运行 我得到一个空对象。
需要帮忙
谢谢
清单示例
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rssfeed"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
代码
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
public class ManifestP2 {
static Document document;
static Element root;
static NeededTag tags;//Data receiver
public static void main(String[] args){
SAXBuilder builder = new SAXBuilder();
try{
document = builder.build(new File("AndroidManifest.xml"));
}catch(Exception e){
System.out.println(e.getMessage());
}
root = document.getRootElement();
tags = new NeededTag();
findTag();
System.out.println(tags.usesSdk.toString());
}
static void findTag(){
//get values for "uses-sdk" tag
Element sdk = root.getChild("uses-sdk");
tags.usesSdk.minSdk = sdk.getAttributeValue("android:minSdkVersion");
tags.usesSdk.targetSdk = sdk.getAttributeValue("android:targetSdkVersion");
}
}
您文档中的属性位于 android
命名空间中。 XML 中的命名空间确实增加了一定程度的复杂性,但它们也确保您可以拥有特殊类型的文档,例如您的清单,您可以在其中将 "meta" 类型的信息存储在同一文档中常规数据,同时仍然保证不会有任何名称冲突。
这是一种复杂的说法,即您在 XML 文档中看到 android
的地方指的是命名空间,而不是属性名称。
因此,例如,您有:
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />
这实际上意味着您拥有自己的元素 uses-sdk
,并且该元素具有 2 个属性,一个称为 minSdkVersion
,另一个称为 targetSdkVersion
。这些属性位于具有 URI 的名称空间中:http://schemas.android.com/apk/res/android
.
要从 JDOM 中的元素中获取这些属性,您必须在正确的命名空间中按名称请求它们。
为此,您有代码:
Namespace ans = Namespace.getNamespace("android", "http://schemas.android.com/apk/res/android");
String min = sdk.getAttributeValue("minSdkVersion", ans);
String target = sdk.getAttributeValue("targetSdkVersion", ans);
您声明要搜索的命名空间(搜索时只有 URI 很重要,android
命名空间前缀只是为了方便)
希望你一切都好。 我必须解析一个 android 清单文件来提取像 'the minSdkVersion' 这样的数据,经过几次搜索后我发现了一个使用 JDOM 的代码。 显示与 "uses-sdk" 相关的数据是预期的,但是当 运行 我得到一个空对象。 需要帮忙 谢谢
清单示例
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rssfeed"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
代码
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
public class ManifestP2 {
static Document document;
static Element root;
static NeededTag tags;//Data receiver
public static void main(String[] args){
SAXBuilder builder = new SAXBuilder();
try{
document = builder.build(new File("AndroidManifest.xml"));
}catch(Exception e){
System.out.println(e.getMessage());
}
root = document.getRootElement();
tags = new NeededTag();
findTag();
System.out.println(tags.usesSdk.toString());
}
static void findTag(){
//get values for "uses-sdk" tag
Element sdk = root.getChild("uses-sdk");
tags.usesSdk.minSdk = sdk.getAttributeValue("android:minSdkVersion");
tags.usesSdk.targetSdk = sdk.getAttributeValue("android:targetSdkVersion");
}
}
您文档中的属性位于 android
命名空间中。 XML 中的命名空间确实增加了一定程度的复杂性,但它们也确保您可以拥有特殊类型的文档,例如您的清单,您可以在其中将 "meta" 类型的信息存储在同一文档中常规数据,同时仍然保证不会有任何名称冲突。
这是一种复杂的说法,即您在 XML 文档中看到 android
的地方指的是命名空间,而不是属性名称。
因此,例如,您有:
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" />
这实际上意味着您拥有自己的元素 uses-sdk
,并且该元素具有 2 个属性,一个称为 minSdkVersion
,另一个称为 targetSdkVersion
。这些属性位于具有 URI 的名称空间中:http://schemas.android.com/apk/res/android
.
要从 JDOM 中的元素中获取这些属性,您必须在正确的命名空间中按名称请求它们。
为此,您有代码:
Namespace ans = Namespace.getNamespace("android", "http://schemas.android.com/apk/res/android");
String min = sdk.getAttributeValue("minSdkVersion", ans);
String target = sdk.getAttributeValue("targetSdkVersion", ans);
您声明要搜索的命名空间(搜索时只有 URI 很重要,android
命名空间前缀只是为了方便)