解析XML删除&之后的所有字符

时间:2013-04-21 21:54:40

标签: java android xml-parsing escaping

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

但是在两台设备上(三星Sidekick 4g API 2.2和三星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和一些仿真器),这种方式正常工作,如下所示:

enter image description here

然而,在我试过的两个三星设备上,getValue()方法仅返回&amp;之前的文本,因此结果为:

enter image description here

3 个答案:

答案 0 :(得分:3)

那是因为你没有看其余的节点。实体获取不同的节点,实体后面的文本在此之后获取节点。您将立即返回 - 您需要连接结果。

答案 1 :(得分:3)

这是某些Android版本的known bug。它固定在Honeycomb(3.0)中。

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

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

答案 2 :(得分: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 "";
  } 

现在它正确地得到了文本的后半部分。

相关问题