【问题标题】:Android's XMLPullParser getAttributeValue is removing leading zeros from stringAndroid 的 XMLPullParser getAttributeValue 正在从字符串中删除前导零
【发布时间】:2017-12-12 02:55:20
【问题描述】:

我有一个 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)
    {
    }
}

【问题讨论】:

  • 我认为实际上是新的 aapt 版本在处理过程中剥离了这些内容。 getAttributeValue() 只是盲目地将任何值作为字符串返回。您可以通过暂时禁用 aapt2 来测试:stackoverflow.com/a/46988209。
  • 谢谢 Mike,确实解决了问题!
  • 实际上更像是一种临时解决方法,而不是修复。这似乎是 aapt2 中的一个错误。等我有更多时间的时候,我得研究一下。很高兴它现在对你有用,至少。
  • 7 个月后更新:我有最新版本的 Android Studio,但仍然禁用了 aapt2。我现在在构建应用程序时收到一条警告消息:“选项 'android.enableAapt2' 已弃用,不应再使用。”如果我在启用 aapt2 的情况下构建,它仍然会从 XML 中删除前导零。是否有任何人都知道的更永久的解决方法或修复?谢谢。
  • 啊,是的,这个东西。我完全忘记了调查这个,早在什么时候。我会尽量记住尽快去做。目前唯一想到的其他“解决方法”是将您的 XML 文件移动到raw/。它将在没有任何预处理的情况下打包,因此应该保留所有内容,但您必须稍微更改代码。

标签: android xml xmlpullparser xmlresourceparser


【解决方案1】:

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

您还需要升级 Android Gradle 插件 (AGP)(如下所示:https://stackoverflow.com/a/35272475)

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

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

请注意,这可能会增加您的 APK 大小。

【讨论】:

    【解决方案2】:

    XmlResourceParser 提供所有数据类型的返回值,您从解析器值获取 int Agencycode。所以代替getAttributeValue() 使用getAttributeIntValue("namespace", "attribute",0) 替换掉这个

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

    到

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

    编码愉快!!

    【讨论】:

    • 嗨赫曼特。我尝试了您的建议,但 agentCode 是一个字符串,我不想将其转换为“int”,因为这也会丢失前导零。感谢您的建议!
    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2019-10-20
    • 2015-12-25
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多