2013-09-12 6 views
0

Я работаю над небольшим проектом для собственного развлечения, которое включает вывод содержимого нескольких переменных в файл XML. Однако, когда я помещаю программу, трансформатор выводит только первую строку (заголовок XML) и ничего больше. Метод saveData() вызывается перед writeFile(), и я вывел значение переменных в консоль перед вызовом writeFile(), поэтому я знаю, что они имеют значение.Только XML-трансформатор только для XML-преобразования Заголовок XML

код ниже:

public class Output { 
    private static double citySizeMiles; 
    private static double citySizeAcres; 
    private CityType type; 
    private static int gpLimit; 
    private static long totalWealth; 
    private static long cityPopulation; 

    public static void saveData() { 
     cityPopulation = CityGenerator.cityPop; 
     citySizeMiles = City.getCitySizeMiles(cityPopulation); 
     citySizeAcres = City.getCitySizeAcres(cityPopulation); 
     gpLimit = City.getGoldLimit(); 
     totalWealth = CityGenerator.cityWealth; 
    } 

    public static void writefile() { 
     try {   
      DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = docFactory.newDocumentBuilder(); 

      // Root Elements 
      Document doc = builder.newDocument(); 
      Element root = doc.createElement("data"); 

      // Data Element 
      Element data = doc.createElement("City"); 
      root.appendChild(data); 

      Attr attr = doc.createAttribute("name"); 
      attr.setValue("Test"); 
      data.setAttributeNode(attr); 

      // City size (sq miles) 
      Element sizeMi = doc.createElement("sizeMiles"); 
      sizeMi.appendChild(doc.createTextNode(String.valueOf(citySizeMiles))); 
      data.appendChild(sizeMi); 

      // City size (acres) 
      Element sizeAc = doc.createElement("sizeAcres"); 
      sizeAc.appendChild(doc.createTextNode(String.valueOf(citySizeAcres))); 
      data.appendChild(sizeAc); 

      // Population 
      Element pop = doc.createElement("population"); 
      pop.appendChild(doc.createTextNode(String.valueOf(cityPopulation))); 
      data.appendChild(pop); 

      // GP limit 
      Element gpLim = doc.createElement("gpLimit"); 
      gpLim.appendChild(doc.createTextNode(String.valueOf(gpLimit))); 
      data.appendChild(gpLim); 

      // Total fluid wealth 
      Element wealth = doc.createElement("totalWealth"); 
      wealth.appendChild(doc.createTextNode(String.valueOf(totalWealth))); 
      data.appendChild(wealth); 

      // Write to XML file 
      TransformerFactory tf = TransformerFactory.newInstance(); 
      tf.setAttribute("indent-number", 4); 

      Transformer trans = tf.newTransformer(); 
      trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
      trans.setOutputProperty(OutputKeys.METHOD, "xml"); 

      DOMSource source = new DOMSource(doc); 
      //StreamResult result = new StreamResult(new File("D:\\test.xml")); 

      StreamResult result = new StreamResult(System.out); 

      trans.transform(source, result); 

     } catch(ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     } catch(TransformerException tfe) { 
      tfe.printStackTrace(); 
     } 
    } 
} 

ответ

1

Я не специалист по DOM (я избегаю его, как чумы, и поощрять всех остальных сделать то же самое), но я думаю, что вы не смогли связать корневой элемент к узел документа.

+0

Я тоже новичок в DOM (и не знал об альтернативе). Есть ли у вас какие-либо предложения относительно этой альтернативы, например ссылки на дополнительную информацию или объяснение того, как я не смог подключить корневой элемент к этому узлу документа? – Flawedspirit

+0

Мои предпочтительные древовидные модели - JDOM и XOM. Они намного проще, чем DOM, гораздо более ориентированы на Java и разработаны с гораздо лучшим пониманием XML (DOM начинался как HTML-вещь, а пространства имен были запоздалой мыслью). Но мое реальное предпочтение - не обрабатывать XML в Java вообще: XSLT и XQuery делают работу намного лучше. Что касается особенностей, так же, как вы сделали root.apppendChild (data), вам необходимо подключить корневой элемент к узлу документа. –

+0

Такое простое исправление! Ну, я предпочитаю исправления, которые берут только одну строку кода, а не часы разрыва. Большое спасибо, сэр! – Flawedspirit

Смежные вопросы