无法从Java中获取CDATA的数据

时间:2014-01-20 05:38:17

标签: 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();
            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帮助!!

1 个答案:

答案 0 :(得分:2)

您的代码无效的原因是您的card元素有三个子节点:

  • 具有单个空格的文本节点
  • 带有一堆文字的CDATA节点
  • 带有一堆空格的文本节点

您的代码选择了最后一个子节点(这只是空格)来填充content变量和child变量的第一个节点,该变量是(a)不是CDATA节点, (b)只是空的空间,这解释了你观察到的行为。对此的简单修复是使用以下内容获取content并跳过所有CharacterData投射:

String content = cardNode.getTextContent().trim(); 

要回答您的后续问题,有时人们可能希望非常精确并将CDATA节点识别为CDATA节点(并分别在单独的文本节点上操作),因此API提供了执行此操作的功能。但.getTextContent()方法允许获取元素的整个文本内容,并且在您的情况下应该可以正常工作。