我正在创建一个解析一些XML并在ListView中显示它的应用程序。我的xml中的一些项目包含&
,所以我已经像这样转义它们&
它在一些设备上和模拟器上正常工作。
但是在两台设备上(三星Sidekick 4g API 2.2和三星Replish API 2.3.6)它失败了。 &
之后的一切都神奇地消失了。
以下是XML中的项目给我带来了麻烦:
<site>
<name>English Language & Usage</name>
<link>http://english.stackexchange.com/</link>
<about>English Language & 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()
方法仅返回&
之前的文本,因此结果为:
答案 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 "";
}
现在它正确地得到了文本的后半部分。