java编译未声明,Java使用未声明的名称空间解析xml

Each time our new android app released, I need to update app info on our website. So I try to update the app info automatically, by read the AndroidManifest.xml in the apk when uploaded to server.

I use AXMLResource and jdom2 to get the AndroidManifest.xml and parse it.

final Namespace NS = Namespace.getNamespace("http://schemas.android.com/apk/res/android");

zipFile = new ZipFile(apkPath);

ZipEntry zipEntry = new ZipEntry("AndroidManifest.xml");

inputStream = zipFile.getInputStream(zipEntry);

AXMLResource axmlResource = new AXMLResource();

axmlResource.read(inputStream);

SAXBuilder saxBuilder = new SAXBuilder();

Document document = saxBuilder.build(new ByteArrayInputStream(axmlResource.toXML().toString().getBytes("UTF-8")));

Element root = document.getRootElement();

System.out.println(root.getAttributeValue("versionCode",NS));

System.out.println(root.getAttributeValue("versionName",NS));

But I always get,

The prefix “data” for attribute “data:versionCode” associated

with an element type “manifest” is not bound

And I print the AndroidManifest.xml,and found the data namespace is unclared.

xmlns:android="http://schemas.android.com/apk/res/android"

data:versionCode="344"

data:versionName="3.2.8"

When I check android studio doc and found there use declared namespace.

Then I think this may be caused by our app developers's Irregularities.

But when I think further, why app with AndroidManifest.xml with undeclared namespace can released, then I download some apks like facebook,youtube,centos,baidu disk and alipay, and found only centos doesn't use undeclared namespace.

For com.google.android.youtube.apk

xmlns:android="http://schemas.android.com/apk/res/android"

http:versionCode="1425572340"

http:versionName="14.25.57"

The prefix “http” for attribute “http:versionCode” associated

with an element type “manifest” is not bound

For com.facebook.katana-225.0.0.47.118.apk

xmlns:android="http://schemas.android.com/apk/res/android"

manifest:versionCode="158425934"

manifest:versionName="225.0.0.47.118"

The prefix “manifest” for attribute "manifest:versionCode” associated

with an element type “manifest” is not bound

So here is comman to use undeclased namespace in AndroidManifest.xml,but how can I pase it?

解决方案

Technically your file is well-formed XML but not namespace-well-formed XML. The vast majority of modern XML tools will only handle (or produce) XML that is namespace-well-formed. But if you can find an XML parser that still handles XML that is not namespace-well-formed, then you can use this to "repair" your XML in some way that meets your needs (for example, you could replace manifest:versionCode by manifest-versionCode).

However, rather than repairing the XML in this way, it would be much better to create namespace-well-formed XML in the first place, so you're not constrained in your choice of tools.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值