2012-04-06 17 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

、あなたはおそらくそれのためのより良いでしょう。 –

答えて

5

私はあなたの問題はgetTagValueメソッドから次のコード行であることを疑っています:

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

あなたは常に最初の子を取得しています!しかし、あなたは複数あるかもしれません。テキストノード「詳細」、および「ここで」テキストノード「CDATAで」CDATAノード:

次の例では、3人の子供持っているあなたのコードを実行した場合、あなただけの「詳細」を得る

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

を、あなたは残りをゆるめる。 「ここにCDATAして詳細」CDATAノード:

次の例では、1子を持つ

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

あなたのコードを実行した場合、あなたはすべてを取得します。

しかし、書かれたこの方法上記と同じ例:スペースや改行をテキストノードとしてピックアップされているので、今、3人の子供を持っている

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

。あなたがコードを実行すると、改行で最初の空のテキストノードが得られます。

すべての子をループして(何回でも)、値を連結して完全な結果を得るか、またはCDATA内のプレーンテキストとテキストを区別することが重要でない場合は、最初のドキュメントビルダーファクトリのcoalescingプロパティ:あなたはなどXOM、DOM4Jを使用できるかどうかは別としてボグダンの優れた説明から

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.nodeValue'の代わりに' element.childNodes [0] .nodeValue'が私のトリックでした!ありがとう! –

関連する問題