我有以下简单的代码:
NodeList nodeList = document.getDocumentElement().getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node vtvRespNode = nodeList.item(i);
NodeList cardNodes = vtvRespNode.getChildNodes();
for (int j = 0; j < cardNodes.getLength(); j++) {
Node cardNode = cardNodes.item(j);
Card card = vtvResponse.new Card();
if (cardNode instanceof Element) {
String content = cardNode.getLastChild().getTextContent().trim();
if(cardNode.getNodeName().equals(CARD_TYPE)) {
Log.i(TAG,"cardType set for this card: "+content);
}
else if(cardNode.getNodeName().equals(TTL)) {
Log.i(TAG,"TTL set for this card: "+content);
}
else if(cardNode.getNodeName().equals(LOCAL_TIME_STAMP)) {
Log.i(TAG,"localtimeStamp set for this card: "+content);
}
else if(cardNode.getNodeName().equals(CARD_BLOB)) {
CharacterData child = (CharacterData) cardNode.getFirstChild();
if(child instanceof CharacterData){
Log.i(TAG,"cardNode is instanceof CharacterData");
content = child.getData();
}
Log.i(TAG,"blob set for this card: "+content);
}
}
}
}
现在,我有这个示例xml:
<VtvResp>
<CI>
<localts> 1233546 </localts>
<ctype> 4 </ctype>
<ttl> 76542 </ttl>
<card> <![CDATA[{"timezone": 330.0, "date": "03/10/13", "windspeed": "15", "weather": "Partly Cloudy", "temperature": "28", "time": "04:02", "city_name": "Bangalore", "country": "India", "day": "thursday", "meridian": "pm"}]]>
</card>
</CI>
</VtvResp>
在这里,我无法从xml获取CDATA数据。 else if
blob的最后一个日志总是返回一个空字符串,我无法弄清楚我做错了什么。
Plz帮助!!
答案 0 :(得分:2)
您的代码无效的原因是您的card
元素有三个子节点:
您的代码选择了最后一个子节点(这只是空格)来填充content
变量和child
变量的第一个节点,该变量是(a)不是CDATA节点, (b)只是空的空间,这解释了你观察到的行为。对此的简单修复是使用以下内容获取content
并跳过所有CharacterData
投射:
String content = cardNode.getTextContent().trim();
要回答您的后续问题,有时人们可能希望非常精确并将CDATA节点识别为CDATA节点(并分别在单独的文本节点上操作),因此API提供了执行此操作的功能。但.getTextContent()
方法允许获取元素的整个文本内容,并且在您的情况下应该可以正常工作。