Я работаю над небольшим проектом для собственного развлечения, которое включает вывод содержимого нескольких переменных в файл 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();
}
}
}
Я тоже новичок в DOM (и не знал об альтернативе). Есть ли у вас какие-либо предложения относительно этой альтернативы, например ссылки на дополнительную информацию или объяснение того, как я не смог подключить корневой элемент к этому узлу документа? – Flawedspirit
Мои предпочтительные древовидные модели - JDOM и XOM. Они намного проще, чем DOM, гораздо более ориентированы на Java и разработаны с гораздо лучшим пониманием XML (DOM начинался как HTML-вещь, а пространства имен были запоздалой мыслью). Но мое реальное предпочтение - не обрабатывать XML в Java вообще: XSLT и XQuery делают работу намного лучше. Что касается особенностей, так же, как вы сделали root.apppendChild (data), вам необходимо подключить корневой элемент к узлу документа. –
Такое простое исправление! Ну, я предпочитаю исправления, которые берут только одну строку кода, а не часы разрыва. Большое спасибо, сэр! – Flawedspirit