Android的XMLPullParser getAttributeValue正在从字符串中删除前导零

问题描述 投票:2回答:2

我有一个XML文档,其中包含带前导零的字符串。当我使用XmlResourceParser迭代XML文件时,我注意到在调用getAttributeValue时修改了带有前导零的字符串,删除了前导零。此功能在过去有效,我在升级到Android Studio 3.x后才注意到。为了让“getAttributeValue”保留前导零,我需要做些什么特别的事吗?

这是我正在使用的测试XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<FictionalSpies>
<Property Country="Great Britain" Agency="MI6">
    <Item FullName="James Bond" AgentCode="007" />
    <Item FullName="John Wolfgramm" AgentCode="0010" />
    <Item FullName="Sam Johnston" AgentCode="0012" />
</Property>
<Property Country="United States" Agency="CONTROL">
    <Item FullName="Maxwell Smart" AgentCode="86" />
    <Item FullName="Unknown" AgentCode="99" />
    <Item FullName="The Chief" AgentCode="Q" />
</Property>
<Property Country="United States" Agency="MiB">
    <Item FullName="James Darrell Edwards III" AgentCode="J" />
    <Item FullName="Kevin Brown" AgentCode="K" />
    <Item FullName="Derrick Cunningham" AgentCode="D" />
</Property>
</FictionalSpies>

这是列表中每个“间谍”的日志打印输出。正如您所看到的,前三个在AgentCode中丢失了“00”。例如,詹姆斯邦德应该有代理商代码“007”而不是“7”。

D/XMLTest: Great Britain MI6 James Bond 7
D/XMLTest: Great Britain MI6 John Wolfgramm 10
D/XMLTest: Great Britain MI6 Sam Johnston 12
D/XMLTest: United States CONTROL Maxwell Smart 86
D/XMLTest: United States CONTROL Unknown 99
D/XMLTest: United States CONTROL The Chief Q
D/XMLTest: United States MiB James Darrell Edwards III J
D/XMLTest: United States MiB Kevin Brown K
D/XMLTest: United States MiB Derrick Cunningham D

下面是连接到表单上按钮的代码,并迭代生成以前日志消息的XML:

public void buttonOnClick(View v)
{
    int eventType = -1;
    String name;
    String country = null;
    String agency = null;
    String fullName = null;
    String agentCode = null;

    try
    {
        XmlResourceParser xmlRP = getResources().getXml(R.xml.test);

        while (eventType != XmlResourceParser.END_DOCUMENT)
        {
            if (eventType == XmlResourceParser.START_TAG)
            {
                name = xmlRP.getName();
                if (name.contentEquals("Property"))
                {
                    country = xmlRP.getAttributeValue(null, "Country");
                    agency = xmlRP.getAttributeValue(null, "Agency");
                } else if (name.contentEquals("Item"))
                {
                    fullName = xmlRP.getAttributeValue(null, "FullName");
                    agentCode = xmlRP.getAttributeValue(null, "AgentCode");

                    Log.d("XMLTest", country + " " + agency + " " + fullName + " " + agentCode );
                }
            }
            eventType = xmlRP.next();
        }
    } catch (XmlPullParserException e)
    {

    } catch (IOException e)
    {
    }
}
android xml xmlpullparser xmlresourceparser
2个回答
0
投票

XmlResourceParser提供所有数据类型的返回值,您从解析器值获取int Agencycode。因此,而不是getAttributeValue()使用getAttributeIntValue("namespace", "attribute",0)只是取代这个

agentCode = xmlRP.getAttributeValue(null, "AgentCode");

agentCode =xmlRP.getAttributeIntValue(null, "AgentCode",0);

快乐的编码!!


0
投票

这是AAPT2中的一个错误。它是reported,已在Android Studio 3.4和3.5中修复(请参阅https://androidstudio.googleblog.com/2019/01/android-studio-35-canary-2-available.html)。

你也需要升级Android Gradle Plugin(AGP)(如下所示:https://stackoverflow.com/a/35272475

使用以下build.gradle条目,可以更改AAPT2行为以保持前导零:

android {
    aaptOptions {
        additionalParameters "--keep-raw-values"
    }
}

请注意,这可能会增加您的APK尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.