java dom cdata_java – 通过DOM解析器从XML处理CDATA
我以前從未處理過XML,所以我不確定如何在XML文件中處理CDATA.我迷失在節(jié)點(diǎn),父節(jié)點(diǎn),子節(jié)點(diǎn),nList等中.
誰能告訴我這些代碼片段的問題是什么?
我的getTagValue()方法適用于除“詳細(xì)信息”之外的所有標(biāo)記,“詳細(xì)信息”是包含CDATA的標(biāo)記.
.....
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();
}
解決方法:
我懷疑你的問題出在getTagValue方法的以下代碼行中:
Node nValue = (Node) nlList.item(0);
你總是得到第一個(gè)孩子!但是你可能不止一個(gè).
以下示例有3個(gè)子節(jié)點(diǎn):文本節(jié)點(diǎn)“detail”,CDATA節(jié)點(diǎn)“with cdata”和文本節(jié)點(diǎn)“here”:
detail here
如果你運(yùn)行你的代碼,你只得到“細(xì)節(jié)”,你就會(huì)失去其余部分.
以下示例有1個(gè)子節(jié)點(diǎn):CDATA節(jié)點(diǎn)“此處帶有cdata的詳細(xì)信息”:
如果你運(yùn)行你的代碼,你會(huì)得到一切.
但是上面這樣寫的例子如下:
現(xiàn)在有3個(gè)孩子因?yàn)榭崭窈蛽Q行被選為文本節(jié)點(diǎn).如果您運(yùn)行代碼,則會(huì)獲得帶有換行符的第一個(gè)空文本節(jié)點(diǎn),其余部分將丟失.
您要么遍歷所有子項(xiàng)(無論多少)并連接每個(gè)子項(xiàng)的值以獲得完整結(jié)果,或者如果區(qū)分純文本和CDATA內(nèi)的文本并不重要,則在上面設(shè)置合并屬性文檔制作工廠首先:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setCoalescing(true);
...
標(biāo)簽:cdata,java,dom,xml
來源: https://codeday.me/bug/20190902/1789863.html
總結(jié)
以上是生活随笔為你收集整理的java dom cdata_java – 通过DOM解析器从XML处理CDATA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql添加timestamp有什么用
- 下一篇: java设计模式初探之装饰者_JAVA设