简体   繁体   English

从XML文件Java深入读取特定元素

[英]Reading particular elements deep inside from an XML file java

I have to read an android manifest file which look like the following, 我必须阅读一个如下所示的android清单文件,

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="92" android:versionName="1.9.7B92" package="com.rechild.advancedtaskkiller"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:label="@string/app_name" android:icon="@drawable/icon2">
        <activity android:label="@string/app_name" android:name=".AdvancedTaskKiller" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.rechild.intent.action.ADVANCED_TASK_KILLER_FREE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:name=".NewSettings" />
        <activity android:name=".IgnoreListActivity">
            <intent-filter>
                <action android:name="com.rechild.advancedtaskkiller.intent.action.IgnoreList" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:name=".HealthActivity" />
        <activity android:name=".LogActivity" />
        <activity android:name=".HelpActivity" />
        <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation" />
        <receiver android:name=".AutoStartReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
        <service android:name=".BackService" android:exported="true" />
        <receiver android:label="@string/app_name" android:icon="@drawable/icon2" android:name=".OneClickAppWidgetProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_provider" />
        </receiver>
        <receiver android:name=".AlarmReceiver" />
    </application>
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" />
</manifest>

My goal is to read the values of the android:name property in all activity elements. 我的目标是读取所有活动元素中android:name属性的值。 How can I achieve that in java? 如何在Java中实现?

I solved this problem, here is my code, 我解决了这个问题,这是我的代码,

package mytest;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 *
 * @author 
 */
public class ManifestParser {

    public static void Parse(String fileName) {

    try 
    {
        File file = new File(fileName);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(file);
        doc.getDocumentElement().normalize();
        System.out.println("Root element " + doc.getDocumentElement().getNodeName());
        NodeList nodeLst = doc.getElementsByTagName("application");
        System.out.println("Information of all activities");

        for (int s = 0; s < nodeLst.getLength(); s++) {


            Node fstNode = nodeLst.item(s);

          if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

            Element fstElmnt = (Element) fstNode;
            NodeList fstNmElmntLst = fstElmnt.getChildNodes();
            int sz=fstNmElmntLst.getLength();


            for(int nodes=0;nodes<sz;nodes++)
            {
                Node tempNode=fstNmElmntLst.item(nodes);
                if (tempNode.getNodeType() == Node.ELEMENT_NODE)
                {
                    Element tmpElmnt = (Element) tempNode;
                    NamedNodeMap nn=tmpElmnt.getAttributes();

                    if(tmpElmnt.getNodeName().equals("activity"))System.out.println("a: "+tmpElmnt.getAttribute("android:name"));
                }
            }

          }

       }
    } catch (Exception e) {
      e.printStackTrace();
    }
   }



}

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

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