2012-03-14 6 views
1

私はgeneradetにxsdスキーマのjavaクラスをJAXBで持っています。 Mainクラスでは、私はrecursiveNodeList(NodeList list)というメソッドを持っています。これは単にノードリストをとり、すべての値を取得するために反復して繰り返します。JAXB:値を設定しただけで値が返され、他の値を設定すると実際の値が返されるのはなぜですか?

私は単純に理解できないもの以外はすべて動作します。 I以下のコードで

は、これら2つの行を持っている:

title->#text->Title1 
note->#text->Notetest1 

私はちょうどのような行のいずれかを使用する場合:私は、コードを実行すると

item.setNote("Notetest1"); 
item.setTitle("Title1"); 

私はこの出力を取得

item.setNote("Notetest1"); 
// item.setTitle("Title1"); /*commented out*/ 

私はこの出力を得る:

item->note->null 

なぜノートは、私はちょうどその値を設定し、setTitle()を呼び出すと、私はその全体のコード

setNotesetTitle?

の両方を呼び出すときに、なぜそれが値を持たないいない場合はnullです:

public class JavaXML { 

    public static void main(String[] args) throws ParserConfigurationException, JAXBException, FileNotFoundException { 
     Item item = new Item(); 

     JAXBContext jaxb = JAXBContext.newInstance(item.getClass().getPackage().getName());   
     Marshaller marshaller = jaxb.createMarshaller(); 
     item.setNote("Notetest1"); 
     item.setTitle("Title1"); 


     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.newDocument(); 
     marshaller.marshal(item, doc); 

     NodeList nodeList = doc.getChildNodes(); 
     recursiveNodeList(nodeList); 

    } 

    public static void recursiveNodeList(NodeList nodeList) { 
     for(int i = 0; i< nodeList.getLength(); i++) { 
      Node fstNode = nodeList.item(i); 
      if (fstNode.getNodeType() == Node.ELEMENT_NODE) {    
       Element fstElmnt = (Element) fstNode; 

       if(fstElmnt.getChildNodes().getLength() > 1) { 
        NodeList fstNmElmntLst = fstElmnt.getChildNodes(); 
        recursiveNodeList(fstNmElmntLst); 
       } else { 
        NodeList fstNmElmntLst = fstElmnt.getChildNodes(); 
        if(((Node)fstNmElmntLst.item(0)) != null) 
         System.out.println(fstNode.getNodeName()+"->"+((Node)fstNmElmntLst.item(0)).getNodeName() + "->"+((Node)fstNmElmntLst.item(0)).getNodeValue()); 
       } 
      } 
     } 
    } 
} 

編集

別の質問: タイトルとメモを設定する代わりに、次のようなカテゴリを設定してください:

Category category = new Category(); 
category.setStringOne("string1"); 
category.setStringTwo("string2"); 
item.setCategory(category); 

その後、出力は次のようになります。

item->category->string1string2 

は、文字列操作技術を使用せずに別の変数に「文字列1」と「文字列2」の値を取得する方法はありますか?

答えて

1

エラーはrecursiveNodeListメソッドにあります。単一要素の場合、ElementノードのSystem.out.println行に当たっていましたが、2つの要素の場合、のノードを持つSystem.out.println行に当たっていました。以下のコードは動作しますが、おそらくクリーンアップが必要です。

public static void recursiveNodeList(NodeList nodeList) { 
    for(int i = 0; i< nodeList.getLength(); i++) { 
     Node fstNode = nodeList.item(i); 
     if (fstNode.getNodeType() == Node.ELEMENT_NODE) {    
      Element fstElmnt = (Element) fstNode; 

      if(fstElmnt.getChildNodes().getLength() > 1) { 
       NodeList fstNmElmntLst = fstElmnt.getChildNodes(); 
       recursiveNodeList(fstNmElmntLst); 
      } else { 
       NodeList fstNmElmntLst = fstElmnt.getChildNodes(); 
       Node node = fstNmElmntLst.item(0); 
       if(node != null) 
        if(node.getNodeType() == Node.ELEMENT_NODE) { 
         System.out.println(fstNode.getNodeName()+"->"+node.getNodeName() + "->"+((Element)node).getTextContent()); 
        } else { 
         System.out.println(fstNode.getNodeName()+"->"+node.getNodeName() + "->"+node.getNodeValue()); 
        } 
       } 
      } 
     } 
    } 
} 

UPDATE

あなたのJAXB(JSR-222)の実装は、正しく文書を作成しています。表示されている元のエラーと更新されたエラーは、recursiveNodeListでDOMノードを処理する方法によるものです。そのアプローチを続けることに興味があるなら、現在のノードがタグ(すなわちnote)に対応し、要素タイプで、テキスト(つまりNotetest1)に対応しているときにコードをステップ実行し、注意を払うことをお勧めしますテキストタイプの以下では、XPathを使用してより使いやすい文書をイントロスペクトする新しいコード例を示しました。

package forum9698306; 

import javax.xml.bind.*; 
import javax.xml.parsers.*; 
import javax.xml.xpath.*;  
import org.w3c.dom.*; 

public class JavaXML { 

    public static void main(String[] args) throws Exception { 
     Item item = new Item(); 

     JAXBContext jaxb = JAXBContext.newInstance(item.getClass().getPackage().getName());   
     Marshaller marshaller = jaxb.createMarshaller(); 
     item.setNote("Notetest1"); 
     item.setTitle("Title1"); 

     Category category = new Category(); 
     category.setStringOne("string1"); 
     category.setStringTwo("string2"); 
     item.setCategory(category); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.newDocument(); 
     marshaller.marshal(item, doc); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     System.out.println(xpath.evaluate("item/note/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/title/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/category/stringOne/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/category/stringTwo/text()", doc, XPathConstants.STRING)); 
    } 

} 

出力

Notetest1 
Title1 
string1 
string2 
+0

はどうもありがとうございました!以前はXMLで作業していませんでしたが、ノードはいつTextノードになるのですか? – Rox

+0

また、私の他の質問を見てください。上記の私の投稿で、私の編集を見てください(太字で表示)。 – Rox

+0

@Rox - 更新した内容に基づいて自分の回答を更新しました。また使いやすいと思われる方法を提供しました。 –

関連する問題