2011-09-12 39 views
9

javaの一部のXMLの解析に少し問題があります。私のXMLファイルは正しく読み込まれており、ノードのgetTextContent()関数を使用して、問題なくファイルから大部分の情報を得ることができます(xmlスニペットに表示されているStreamTypeノード)。java - getTextContent()とgetNodeValue()のxmlの解析では n、 t、および空白のみが返されます

しかし、ノードの子を扱おうとすると、getNodeValue()とgetTextContent()の両方がこのランダム値「\ n \ t \ t」を返します。

NodeListプロパティのNodeNodesが正しく設定されているようです(18個の「Property」要素がすべて含まれています)。

ここに私のコードからの抜粋です:

Document document; 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
document = builder.parse(appXML); 

... 

String typeName = document.getElementsByTagName("StreamType").item(0).getTextContent(); 

... 

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
int nodelistlength = propertyNodes.getLength(); 
for (int i = 0; i < nodelistlength; i++) { 
    Node currentNode = propertyNodes.item(i); 
    Node nameNode = currentNode.getFirstChild(); 
    Node valueNode = currentNode.getLastChild(); 

    String name = nameNode.getNodeValue(); 
    String value = valueNode.getNodeValue(); 

    if (nameNode.getTextContent().equalsIgnoreCase("maxConnections")) 
     limit = valueNode.getTextContent(); 
} 

そして、ここでは、私が解析しようとしているXMLからいくつかの切れ端です:

<Root> 
<Application> 
    <Streams> 
    <StreamType>live</StreamType> 
    ... 
    </Streams> 

    ... 

    <Properties> 

    ... 

    <Property> 
    <Name>maxConnections</Name> 
    <Value>1000</Value> 
    </Property> 

    ... 

    </Properties> 
</Application> 
</Root> 

私はここで間違っているかもしれないものの任意のアイデアは?どうもありがとう!

編集:@homeさんが投稿したチュートリアルのおかげで、今動作します。これは私が、コードを固定する方法である:からこの便利な機能を追加しました)

String limit = "-1"; 
NodeList propertyNodes = document.getElementsByTagName("Property"); 
for (int i = 0; i < propertyNodes.getLength(); i++) { 
    Node currentNode = propertyNodes.item(i); 

    if (currentNode.getNodeType() != Node.ELEMENT_NODE) 
     continue; 

    Element currentElement = (Element)currentNode; 

    if (getTagValue("Name",currentElement).equalsIgnoreCase("maxConnections")) 
     limit = getTagValue("Value",currentElement); 
} 

2:

1)「文字列の制限」で始まり、ループのエンドブラケット用で終わるコードのブロックを修正しましたチュートリアル:

private static String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 
    Node nValue = (Node) nlList.item(0); 
    return nValue.getNodeValue(); 
} 

"Properties"要素の子の名前と値のペアを完全にフェッチします。どうもありがとう!

+0

JAXBを使用できない理由は何ですか? – ChadNC

+1

@home、あなたのチュートリアルは私の問題を解決し、今では私のコードが動作します!私はそれを "最高"とマークしてアップヴォートを与えることができますので、これを回答として投稿してください。本当にありがとう! :) –

+0

@キャサリンウィリアムズ:追加された回答:-) – home

答えて

7

悲しいことに、Java DOMはそれほど使いやすいものではありません。異なるノードタイプを区別する必要があります。最高のチュートリアルではありませんが、これはGoogleを使用して見つけたばかりです:http://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser

+0

ありがとう!それはまさに私が必要としたものでした。申し訳ありませんが、私はupvoteもできませんでしたが、15の担当者が必要です。 –

2

これは、ノードの値の正しい内容です。

<a> 
    <b> 
     stuff 
    </b> 
</a> 

(この場合、テキストコンテンツに等しい)aノードの値が正しくよく、そのためのコースbタグに空白を省略し、開始タグと終了タグの間の空白から成るありませんbタグに属し、aには属しません。

関連する問題