2012-04-06 50 views
3

我以前从未处理过XML,所以我不确定如何在XML文件中处理CDATA。我在节点,父母,孩子节点,nList等迷路了。通过DOM解析器从XML处理CDATA

任何人都可以告诉我,我的问题是从这些代码片段?

我的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(); 
} 
+0

除了波格丹出色的解释,如果你可以使用(XOM)DOM4J,等等,你可能会因此变得更好。 – 2012-04-07 20:01:38

回答

5

我怀疑你的问题出在下面的代码行从getTagValue方法:

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

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

下面的例子有3个孩子:文本节点“细节”,CDATA节点“与CDATA”文本节点“这里”:

<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中的纯文本和文本不重要,请设置coalescing财产上的文档生成器工厂第一:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
docFactory.setCoalescing(true); 
... 

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.

+0

只是在js中寻找相同,所以'element.childNodes [0] .nodeValue'而不是'element.nodeValue'为我做了一个技巧,谢谢! – 2013-03-25 15:52:45