java dom cdata_java – 通过DOM解析器从XML处理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();
}
解決方法:
我懷疑你的問題出在getTagValue方法的以下代碼行中:
Node nValue = (Node) nlList.item(0);
你總是得到第一個孩子!但是你可能不止一個.
以下示例有3個子節點:文本節點“detail”,CDATA節點“with cdata”和文本節點“here”:
detail here
如果你運行你的代碼,你只得到“細節”,你就會失去其余部分.
以下示例有1個子節點:CDATA節點“此處帶有cdata的詳細信息”:
如果你運行你的代碼,你會得到一切.
但是上面這樣寫的例子如下:
現在有3個孩子因為空格和換行被選為文本節點.如果您運行代碼,則會獲得帶有換行符的第一個空文本節點,其余部分將丟失.
您要么遍歷所有子項(無論多少)并連接每個子項的值以獲得完整結果,或者如果區分純文本和CDATA內的文本并不重要,則在上面設置合并屬性文檔制作工廠首先:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setCoalescing(true);
...
標簽:cdata,java,dom,xml
來源: https://codeday.me/bug/20190902/1789863.html
總結
以上是生活随笔為你收集整理的java dom cdata_java – 通过DOM解析器从XML处理CDATA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql添加timestamp有什么用
- 下一篇: gin 怎么通过 post 发送结构体_