无法从Java中的CDATA获取数据
我有以下简单的代码:无法从Java中的CDATA获取数据,java,xml,xml-parsing,Java,Xml,Xml Parsing,我有以下简单的代码: NodeList nodeList = document.getDocumentElement().getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node vtvRespNode = nodeList.item(i); NodeList cardNodes = vtvRespNode.getChildNodes();
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);
}
}
}
}
NodeList NodeList=document.getDocumentElement().getChildNodes();
for(int i=0;i
现在,我有一个示例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>
1233546
4.
76542
在这里,我无法从xml中获取CDATA数据。else if
blob的最后一个日志总是返回一个空白字符串,我无法找出我做错了什么。
请帮忙 代码不起作用的原因是
卡
元素有三个子节点:
- 具有单个空格的文本节点
- 包含一组文本的CDATA节点
- 具有一组空格的文本节点
内容
变量,并选择了子变量的第一个节点,该子节点(a)不是CDATA节点,(b)仅为空白,这解释了您观察到的行为。解决此问题的简单方法是使用以下方法获取内容
并跳过所有字符数据
转换:
String content = cardNode.getTextContent().trim();
为了回答您的后续问题,有时人们可能希望非常精确地将CDATA节点识别为CDATA节点(并分别在单独的文本节点上操作),因此API提供了执行此操作的功能。但是.getTextContent()
方法允许获取元素的整个文本内容,这在您的情况下应该可以很好地完成这项工作。这是一个旁注,但是在您已经强制转换了CharacterData
之后,为什么还要检查它是否是的一个实例呢。这不是有点倒退吗?关于您的实际问题,我建议您尝试String content=cardNode.getTextContent().trim()代码>(没有.getLastChild()
)并跳过整个字符数据业务。是的,刚才看到了。。我粗心的错误我已经改正了Hanks JLRise我让它按照你说的那样工作。但我不明白的是——如果我们不使用CharacterData就可以获得CDATA,那么为什么人们有时仍然使用CharacterData呢?答案很好。谢谢