【问题标题】:ksoap2 xmlPullParserException unterminated entity refksoap2 xmlPullParserException 未终止的实体引用
【发布时间】:2012-06-01 13:54:30
【问题描述】:

我昨天有个用户给我发邮件说他的应用程序有问题,所以我开始和他一起调试,让他给我发了电话日志,当他打电话给服务器

E/Message Exchange::CallWebService(6426): Exception: org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT �������`I�...@1:18 in java.io.InputStreamReader@406c8808) 05-31 12:33:25.573 
W/System.err(6426): org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT �������`I�...@1:18 in java.io.InputStreamReader@406c8808) 05-31-12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.exception(KXmlParser.java:273)05-31 12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.error(KXmlParser.java:269)05-31-12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.pushEntity(KXmlParser.java:781)05-31 12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.pushText(KXmlParser.java:849)05-31 12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.nextImpl(KXmlParser.java:354)05-31 12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.next(KXmlParser.java:1378)05-31 12:33:25.573 
W/System.err(6426):     at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1408)05-31 12:33:25.573 
W/System.err(6426):     at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)05-31 12:33:25.573 
W/System.err(6426):     at org.ksoap2.transport.Transport.parseResponse(Transport.java:100)05-31 12:33:25.573 
W/System.err(6426):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195)05-31 12:33:25.573 
W/System.err(6426):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)05-31 12:33:25.573 
W/System.err(6426):     at ecm2.android.MessageExchange$1.run(MessageExchange.java:96)05-31 12:33:25.573 
W/System.err(6426):     at java.lang.Thread.run(Thread.java:1019)05-31 12:33:27.928 

这是它总是失败的那一行

trans.call(SOAP_ACTION, soapEnvelope);

调用服务器,它只是抛出一个错误。我有这个人的same exact phone,我让他运行exact version I am running,我调用服务器没有问题,但他仍然有问题。

我让他卸载并重新安装了几次,所以我不知道是什么原因导致他的手机出现这种情况而不是我的?

这就是我创建 XML 的方式

private static String CreateCallXML(String sDeviceID, String sEMailAddress, String sVersion) {
    Logging logger = new Logging();
    XmlSerializer serializer = Xml.newSerializer();
    StringWriter writer = new StringWriter();
    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("", "PostData");
        serializer.startTag("", "RetrieveMsg");
        serializer.attribute("", "ver", sVersion);
        serializer.attribute("", "DevID", sDeviceID);
        serializer.attribute("", "eMailAddress", sEMailAddress);
        logger.append("D", className, "CreateCallXML", "LastIncMsgID:" + Settings.LastIncMsgID);
        logger.append("D", className, "CreateCallXML", "LastDLMsgID: " + Settings.LastDLMsgID);
        serializer.attribute("", "LastIncMsgID", "" + Settings.LastIncMsgID);
        serializer.attribute("", "LastDLMsgID", "" + Settings.LastDLMsgID);
        serializer.endTag("", "RetrieveMsg");
        serializer.endTag("", "PostData");
        serializer.endDocument();
        return writer.toString();
    } catch (Exception e) {
        return null;
    }
}

更新 2:

在查看代码后,用户的电子邮件地址似乎是问题,如果我使用它,用户电子邮件地址的示例是abcd3961@gmail.com,它会在命中线路以调用服务器时引发异常。如果我更改电子邮件地址中的一个字母,它会正常执行呼叫。

这是一个 ksoap 问题吗?我不能告诉他更改他的电子邮件地址,我该如何解决这个问题?

【问题讨论】:

    标签: android android-ksoap2


    【解决方案1】:

    未终止实体发生此错误时

    1...响应字符串中的错误可能是某些实体未关闭。

    <root>
        <a> first </a>
        <b>second             <----- </b> missing here
    </roor>
    

    2...您在 xml 文件中获得了一些 xml 字符

     like      & { } � ...
    

    您需要将所有 & 替换为 & amp; see this answer

    ...
    String str = writer.toString();
    str = str.replaceAll("&","&amp;");
    str = str.replaceAll("?","&#63;");
    return str;
    

    【讨论】:

    • 但是为什么这只发生在他的手机上而不是我的手机上?我们都有相同的手机运行相同的版本,我没有问题
    • 这个问题与设备无关,但与解析有关。我认为还有其他错误。立即尝试这个可能会得到解决方案。
    • 对不起,我发现了真正的问题,它的用户电子邮件地址,例如abcd3961@gmail.com 这不是实际的,但数字相同,只是字母不同。无论如何,如果我在我的代码中硬编码,我可以重现这个问题。如果我更改他的电子邮件地址中的任何数字/字母,它会很好地执行呼叫,但它只是确切的abcd3961@gmail.com 组合,这就是问题所在。我不知道为什么这会是个问题。我更新了我的问题
    • 不错!让我遇到了问题.. 该服务的 XML 格式错误,带有一个未转义的 &
    【解决方案2】:

    我在 Android 2.2 设备上遇到了同样的问题,发现 ksoap2 2.6.5 与 Android 2.2 不兼容。好吧,我认为这就是问题所在,我所知道的是它会引发这些错误。我将我的 ksoap2 降级到 2.4,它又开始工作了。

    【讨论】:

    • 是的 2.6.5 不兼容,但这不是我的问题,这是服务器问题
    • 对于它的价值,我通过从 2.6.5 切换到 3.0 RC 4 修复了类似的问题。以前它在 2.2 设备上触发未终止的实体引用异常,但升级库修复了它。
    • @DanDyer :非常感谢先生的建议!你不知道当我的应用由于兼容性错误而停止在 2.1 设备上运行时,我有多害怕!非常感谢!
    【解决方案3】:

    我遇到了同样的问题。解决方案是当我从 XML 发送响应时,我必须将用户名中的“&”替换为 &,因为有些用户有问题,但其他用户没有。

    所以“MAC”答案中的第 2 步

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2013-06-06
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多