Существует несколько методов генерации XML, каждый из которых имеет свои преимущества и недостатки. Самым простым для реализации (но самым трудным сделать правильно) является сборка XML вручную.
Если вы хотите, чтобы список ингредиентов выглядел примерно так:
<ingredients>
<ingredient name="ginger"/>
<ingredient name="cinnamon"/>
<ingredient name="sugar"/>
</ingredients>
Вам нужен код для обхода вектора:
System.out.println("<ingredients>");
Vector ingredients;
for (String name : ingredients) {
System.out.print(" <ingredient name=\"");
System.out.print(name);
System.out.println("\"/>");
}
System.out.println("</ingredients>");
Проблема такого метода заключается в том, что при изменении базовой структуры данных (в вашем случае, вектора массивов, вам нужно изменить код генерации XML, чтобы он соответствовал (что часто приводит к неправильному XML).
Гораздо лучше использовать библиотеку XML для генерации XML. Хорошая библиотека XML всегда будет генерировать действительный XML.
import java.io.FileWriter;
import com.megginson.sax.XMLWriter;
import org.xml.sax.helpers.AttributesImpl;
public class GenerateXML
{
public static void main (String args[])
throws Exception
{
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.startDocument();
writer.startElement("","ingredients","",null);
for (String ingredient : ingredients) {
AttributesImpl attribs = new AttributesImpl();
attribs.addAttribute("","name","","",ingredient);
writer.startElement("", "ingredient","",attribs);
writer.endElement("ingredient");
}
writer.endElement("ingredients");
writer.endDocument();
}
Для более полного описания того, что возможно с DOM XMLWriter, смотрите http://docstore.mik.ua/orelly/xml/sax2/ch02_02.htm с особым вниманием к разделу 2.2.3.
Вы также можете выполнить преобразование DOM в XML, но использование DOM означает, что вы должны создать представление DOM вашей структуры данных, что, вероятно, (в вашем случае) является ненужным и нежелательным дополнительным шагом.
Кроме того, хотя вы можете начать с чего-то вроде массивов Vector of String, такая структура данных имеет мало общего с реальными представлениями о том, что влечет за собой рецепт. Возможно, в конечном итоге вам лучше будет использовать класс Recipie, который содержит классы для ингредиентов и инструкции (которые, в свою очередь, содержат шаги). Хотя может показаться, что для трех или четырех различных типов классов может потребоваться больше усилий, эта предварительная работа экономит более чем в десять раз эквивалентный объем работы при выполнении последних 10% выполненной программы.
Даже для «быстрого» подтверждения концепции экономия времени при использовании действительно описательной структуры данных может быть значительной; поскольку доказательство концепции может быстро стать начальным прототипом, который затем может стать основой для реального выпуска.
Удачи и счастливого программирования!