【问题标题】:parsing an android manifest file with JDOM2使用 JDOM2 解析 android manifest 文件
【发布时间】:2017-03-14 03:14:09
【问题描述】:

希望你没事。 我必须解析一个 android 清单文件以提取使用的“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 jdom-2


    【解决方案1】:

    您文档中的属性位于android 命名空间中。 XML 中的命名空间确实增加了一定程度的复杂性,但它们也确保您可以拥有特殊类型的文档,例如您的清单,您可以在其中将“元”类型的信息作为常规数据存储在同一文档中,同时仍然保证不会有任何名称冲突。

    这是一种复杂的说法,即您在 XML 文档中看到 android 时,它指的是命名空间,而不是属性名称。

    所以,例如,你有:

        <uses-sdk
            android:minSdkVersion="16"
            android:targetSdkVersion="19" />
    

    这实际上意味着您有自己的元素uses-sdk,并且该元素有两个属性,一个称为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 命名空间前缀只是为了方便起见)

    【讨论】:

    • 它变得更加清晰,但即使使用命名空间,问题仍然存在
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多