【问题标题】:Parsing XML dropping all characters after &解析 XML 在 & 之后删除所有字符
【发布时间】:2013-04-21 21:54:39
【问题描述】:

我正在创建一个应用程序来解析一些 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;amp; 之前的文本,所以结果是这样的:

【问题讨论】:

    标签: java android xml-parsing escaping


    【解决方案1】:

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

    【讨论】:

    • 其实根据W3 DOM spec,字符引用(和预定义的实体)并不是应该得到单独的节点的;这是一个在 Honeycomb 中修复的known bug
    • @TedHopp:啊!我一直认为Android在这里的行为很奇怪,但我从未听说过官方的错误,更不用说官方修复了。感谢您指出这一点!
    【解决方案2】:

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

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

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

    【讨论】:

    • 在 for 循环的每次迭代中使用 StringBuilder 并附加 child.getNodeValues() 似乎会产生正确的输出。出于某种原因,我应该警惕将其用作解决方法吗?
    • @FoamyGuy - 这应该可行,虽然我还没有尝试过。我想字符引用节点的节点值是字符?
    【解决方案3】:

    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-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2017-01-15
      • 2013-04-23
      • 2019-07-05
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多