2016-09-18 1 views
0

私は、データをXMLベースのColladaの.DAE形式に変換するツールを開発してきました。残念ながら、1つのことが私を止めています:私のエクスポートされたXMLには私の要素はありません!私のXMLは要素をエクスポートしていません。どうして?

ここにコードがあります。私はそれを読みやすいようにしていますので、読んでいるだけの手間を省くことができます。

public class DAEExport { 
    private static boolean alreadyConstructed = false; 
    private static Document doc = null; 
    private static Element root = null; 
    private static Element lib_images_base_element = null; 
    private static Element lib_geometry_base_element = null; 
    private static Element lib_control_base_element = null; 
    private static Element lib_visual_scene_base_element = null; 

    public static void AppendData() { 
     //Normally this method would have the data to append as its args, but I'm not worried about that right now. 
     //Furthermore, ASSUME THIS RUNS ONLY ONCE (It runs once in the test code I'm using to run this method)! I know that it won't work if called multiple times, as the below variables for the document builder and such wouldn't exist the second time around 
     try { 
      if (!alreadyConstructed) { 
       alreadyConstructed = true; 
       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
       Document document = docBuilder.newDocument(); 

       Element rootElement = document.createElement("SomeGenericElement"); 
       rootElement.appendChild(document.createTextNode("Generic test contents"); 

       document.appendChild(rootElement); 

       doc = document; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void Build(File _out) { 
     try { 
      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      StreamResult result = new StreamResult(System.out); 


      transformer.transform(source, result); 

      alreadyConstructed = false; 
      doc = null; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

[OK]をので、ここに私の問題だ:

<?xml version="1.0" encoding="UTF-8"?> - ノー要素:そして、AppendData()を呼び出してデータを印刷するBuild()を呼び出すことにより、文書にそれらの要素を追加するにもかかわらず、私は次のようなデータを取得します。ちょうど基本的なヘッダー。これだよ。

私が過去の時間や他の何かに気づいていなかったいくつかのばかげたミスのためかどうかはわかりません。私の要素が消えた理由は何ですか?

答えて

0

現在、docオブジェクトはAppendData()メソッドからBuild()メソッドに渡されていません。すべてBuild()は、doc = nullの空の文書です。したがって、あなたの結果はノードが空です(TransformFactoryはXMLヘッダーを追加します)。

docオブジェクトをAppendData()から戻すことを検討してください(他の方法ではクラスレベルで利用できるようにすることをお勧めします)。その後、Build()にそれをdocを再定義して渡します。また

public static Document AppendData() { 
    ... 
    doc = document 
    return(doc) 
} 

AppendData内部Build()を呼び出し、パラメータとしてdocを渡す:

public static void AppendData() { 
    ... 
    doc = document 
    Build(doc, outfile) 
} 

public static void Build(Document doc, File _out) { 
    ... 
} 
+0

ドキュメントがまだあった、なぜ私はまだ一種の混乱 'null'なので。私はそれが_could have_がnullであることを知っていますが、私がAppendData()を呼び出すと、もはやヌルではなくなり、 'doc = document'の行ですか? –

+0

編集: 'Document document = docBuilder.newDocument();'を 'doc = docBuilder.newDocument()'に変更し、 'private static Document doc = null;を' private static Document doc; 'に変更しました。それは今働くようです。なぜこれがうまくいったのか、それ以外の方法では、それほど混乱しませんでした。 –

+0

これはうまくいった。そして、あなたの以前のセットアップは 'doc'を操作しましたが、そのコンテキスト' AppendData() 'のみを操作しました。メソッドが戻り値なしで完了するとすぐに、操作された 'doc'オブジェクトはもはや利用できません。 'Build()'はnull値を持つ初期化された 'doc'(操作されていないもの)のみを見ます。 – Parfait

関連する問題