Java jdom解析xml文件带冒号的属性
如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,比如android的AndroidManifest.xml,N年前遇到过一次忘记记录,后来也忘了,当时好像用的DOM4J,这次用的JDOM,记录下。
解决了,记录下,分享给大家,百度到的都是没有任何用的,这里需要解析的是属性。
DOM4J 可以用,但是便于项目的轻量级,纠结了后,这次使用JDOM 。
以前使用的是正常节点的xml,现在是android的一些配置文件,所以之后出现一系列异常,比如:JDOM cannot handle metadata attributes with namespace prefix等等……
中间百度谷歌了一阵,没有结果,也看了XPath、Jaxen、XNode、XDocument等等,为何这么复杂还回去不到,已经获取到根节点的element了,想了下,jdom应该有考虑带解析冒号的,有的可以@代替,但jdom试了很久,没有结果。
最后还是分析了源代码很久才发现了问题:
既然我们需要的是带冒号的节点属性,那肯定是需要制定NameSpace命名空间的,不需要靠 XPATH 或者 jaxen的,不然它就是默认的命名空间了。
所以这里只需要指定一下就可以:
Namespace type=Namespace.getNamespace("android","http://schemas.android.com/apk/res/android"); System.out.println(ele.getAttributeValue("name",type));
XML文件:(AndroidManifest.xml)
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="29" android:compileSdkVersionCodename="6.2-2438415" android:installLocation="auto" package="com.dujinyang.xxxx" platformBuildVersionCode="23" platformBuildVersionName="6.2-2438415"> <uses-feature android:glEsVersion="0x000520000"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <application android:allowBackup="true" android:banner="@drawable/app_banner" android:debuggable="false" android:hasCode="true" android:icon="@drawable/app_icon" android:isGame="true" android:label="immqy" android:largeHeap="true" android:name="com.dujinyang.xxxx" android:theme="@style/UnityThemeSelector"> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize" android:icon="@drawable/app_icon" android:label="immqy" android:launchMode="singleTop" android:name="com.immqy.3d.activity.UnityMainActivity" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LEANBACK_LAUNCHER"/> </intent-filter> </activity> <meta-data android:name="unity.build-id" android:value="abc53v45wtw5aasdfg"/> <meta-data android:name="unity.splash-mode" android:value="1"/> <meta-data android:name="unity.splash-enable" android:value="true"/> <meta-data android:name="android.max_aspect" android:value="3"/> <meta-data android:name="POOLSDK_CHANNEL_ID" android:value="5201314"/> <meta-data android:name="POOLSDK_CUSTOM_ID" android:value="{}"/> <activity android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTask" android:name="com.DUJINYANG.sdk.view.WebViewActivity" android:screenOrientation="portrait"/> <service android:exported="true" android:name="com.ch.sys.sdk.service.FloatViewService"/> <activity android:configChanges="keyboardHidden|orientation|screenSize" android:name="com.KARL.sdk.H5WebViewActivity" android:screenOrientation="portrait"/> <meta-data android:name="SBSBSB" android:value="67329"/> </application> </manifest>