无法从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呢?答案很好。谢谢