2

我正在创建一个解析一些 XML 并将其显示在 ListView 中的应用程序。我的 xml 中的一些项目包含&s 所以我已经像这样对它们进行了转义&它在一些设备和模拟器上正常工作。

但在两台设备(Samsung Sidekick 4g API 2.2 和 Samsung Replish API 2.3.6)上它失败了。之后的一切&都神奇地消失了。

这是 XML 中给我带来麻烦的项目:

<site>
    <name>English Language &amp; Usage</name>
    <link>http://english.stackexchange.com/</link>
    <about>English Language &amp; Usage Stack Exchange is a question and answer site for linguists, etymologists, and serious English language enthusiasts.</about>
    <image>https://dl.dropboxusercontent.com/u/5724095/XmlParseExample/english.png</image>
</site>

这是解析代码的“肉”:

private static String getValue(Element item, String str) {
    NodeList n = item.getElementsByTagName(str);
    Log.i("StackSites", ""+getElementValue(n.item(0)));
    return getElementValue(n.item(0));
}

private static String getElementValue( Node elem ) {
         Node child;
         if( elem != null){
             if (elem.hasChildNodes()){
                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                     if( child.getNodeType() == Node.TEXT_NODE  ){
                         return child.getNodeValue();
                     }
                 }
             }
         }
         return "";
  }

在某些设备(LG Optimus G、Moto Attrix 2 和一些仿真器)上,它可以正常工作并如下所示:

在此处输入图像描述

然而,在我尝试过的两台三星设备上,getValue()方法只返回之前的文本,&amp;所以结果是这样的:

在此处输入图像描述

4

3 回答 3

3

那是因为您没有查看其余节点。实体获得不同的节点,实体之后的文本获得之后的节点。您将立即返回——您需要连接您的结果。

于 2013-04-21T21:57:41.513 回答
3

这是某些 Android 版本上的已知错误。它已在 Honeycomb (3.0) 中修复。

没有好的解决方法。您需要将文本处理为[text node] [entity node] [text node],自己解释实体引用,并将结果连接起来。

或者,您可以避免使用 XML 字符引用并替换您自己的转义序列。只要解析器没有看到 a &,就可以避免问题。

于 2013-04-21T22:05:30.930 回答
2

CommonsWare 让我指出了正确的方向。

我将getElementValue()方法更改为:

private static String getElementValue( Node elem ) {
     StringBuilder value = new StringBuilder();
     Node child;
     if( elem != null){
         if (elem.hasChildNodes()){
             for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                 if( child.getNodeType() == Node.TEXT_NODE  ){
                     value.append(child.getNodeValue());

                 }
             }
             return value.toString();
         }
     }
     return "";
  } 

它现在可以正确获取文本的后半部分。

于 2013-04-21T22:11:01.783 回答