通过DOM解析器从XML处理CDATA

时间:2012-04-06 03:20:42

标签: java xml dom cdata

我以前从未处理过XML,所以我不确定如何在XML文件中处理CDATA。我迷失在节点,父节点,子节点,nList等中。

有人能告诉我这些代码片段的问题是什么吗?

我的getTagValue()方法适用于除“详细信息”之外的所有标记,“详细信息”是包含CDATA的标记。

.....
NodeList nList = doc.getElementsByTagName("Assignment");
for (int temp = 0; temp < nList.getLength(); temp++) {
    Node nNode = nList.item(temp);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
        Element eElement = (Element) nNode;
        results = ("Class : " + getTagValue("ClassName", eElement)) + 
                  ("Period : " + getTagValue("Period", eElement)) +
                  ("Assignment : " + getTagValue("Details", eElement));
        myAssignments.add(results);
    }
}
.....
private String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

    Node nValue = (Node) nlList.item(0);
    if((CharacterData)nValue instanceof CharacterData)
    {
        return ((CharacterData) nValue).getData();
    }
    return nValue.getNodeValue();
}

1 个答案:

答案 0 :(得分:5)

我怀疑您的问题出现在getTagValue方法的以下代码行中:

Node nValue = (Node) nlList.item(0);

你总是得到第一个孩子!但是你可能有不止一个。

以下示例有3个子节点:文本节点“detail”,CDATA节点“with cdata”和文本节点“here”:

<Details>detail <![CDATA[with cdata]]> here</Details>

如果你运行你的代码,你只能得到“细节”,你就会失去其余部分。

以下示例包含1个子节点:CDATA节点“此处带有cdata的详细信息”:

<Details><![CDATA[detail with cdata here]]></Details>

如果您运行代码,就可以获得所有内容。

但是上面这样写的例子如下:

<Details>
   <![CDATA[detail with cdata here]]>
</Details>

现在有3个孩子,因为空格和换行符被选为文本节点。如果您运行代码,则会获得带有换行符的第一个空文本节点,您将完全放弃。

您要么遍历所有子项(无论多少)并连接每个子项的值以获得完整结果,或者如果区分纯文本和CDATA内的文本并不重要,则设置{首先在文档构建器工厂上添加{1}}属性:

coalescing

Coalescing specifies that the parser produced by this code will convert CDATA nodes to Text nodes and append it to the adjacent (if any) text node. By default the value of this is set to false.