簡體   English   中英

通過 DOM 解析器處理來自 XML 的 CDATA

[英]Processing CDATA from XML via DOM parser

我以前從未處理過 XML,所以我不確定如何在 XML 文件中處理 CDATA。 我迷失在節點、父節點、子節點、nList 等中。

誰能從這些代碼片段中告訴我我的問題是什么?

我的getTagValue()方法適用於除“Details”之外的所有標簽,“Details”是包含 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”:

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

如果你運行你的代碼,你只得到“細節”,你失去了 rest。

以下示例有 1 個子節點:CDATA 節點“此處有 cdata 的詳細信息”:

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

如果你運行你的代碼,你會得到一切。

但是和上面一樣的例子是這樣寫的:

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

現在有 3 個孩子,因為空格和換行被拾取為文本節點。 如果你運行你的代碼,你會得到第一個帶有換行符的空文本節點,你會丟失 rest。

您要么必須遍歷所有子項(無論有多少)並連接每個子項的值以獲得完整結果,要么如果區分純文本和 CDATA 中的文本對您來說並不重要, coalescing在首先是文檔生成器工廠:

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

合並指定此代碼生成的解析器會將 CDATA 節點轉換為文本節點,並將 append 轉換為相鄰的(如果有)文本節點。 默認情況下,此值設置為 false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM