基本上我有一个概念验证应用程序,它是一本数字食谱书。每个配方都是一个对象,每个对象都包含一个包含数组的Vector。 Vector是食谱中所有成分的列表,而每种成分都有一个数组,显示成分的名称,数量和该数量的单位。我想将每个Recipe保存为XML,以便用户可以访问它们。如何在XML或任何其他类型的文件中存储String of String数组,以便以后可以调用和访问它?
答案 0 :(得分:2)
为什么不将配料塑造成真实物体呢?然后你在Recipe下有一系列的Ingredient元素,每个元素都有自己的子元素或名称,数量,单位等属性。
答案 1 :(得分:1)
有几种生成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>");
这种方法的问题在于,当您修改基础数据结构时(在您的情况下,数组的Vector,您需要修改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%课程的同等工作量的十倍。
即使是“快速”概念证明,使用真正描述性数据结构节省的时间也很重要;因为概念证明可能很快成为最初的原型,然后可能成为真正发布的基础。
祝你好运,编程愉快!答案 2 :(得分:0)
要快速开始,您可以使用XStream。它默认生成很好的输出,并且非常灵活,因此您可以在XML中获得所需的内容。
您可以通过编写
将对象序列化为XMLString xml = XStream.toXML(myObject);
对于结构,当您事先不知道数量时,可以继续使用向量和列表,但最好使用域对象(食谱,成分等)列表而不是字符串数组。使用XStream,您不必将所有内容都设置为以XML格式获取它。
如果您确实希望保持所有内容不变,那么默认的XStream行为可能无法满足您的需求。它不知道哪些字符串是食谱,配料等。在这种情况下,你必须多写一点。例如,此代码将Vector作为食谱的配方写入文件“recipes.txt”:
Vector<String[]> recipes = ... (your vector of recipes)
PrettyPrintWriter writer = new PrettyPrintWriter(new FileWriter("recipes.txt"));
writer.startNode("recipes");
for (String[] recipe: recipes)
{
writer.startNode("recipe");
// you might write out attributes, such as the recipe name
for (String ingredient: recipe)
{
writer.startNode("ingredient");
writer.setValue(ingredient);
writer.endNode();
}
writer.endNode();
}
writer.endNode();
writer.close();
对于载体
Vector<String[]> v = new Vector<String[]>();
v.add("2 cups pasta", "1 onion");
v.add("2 eggs", "1.5 cups sugar", "1 tbsp butter");
输出将是
<recipes>
<recipe>
<ingredient>2 cups pasta</ingredient>
<ingredient>1 onion</ingredient>
</recipe>
<recipe>
<ingredient>2 eggs</ingredient>
<ingredient>1.5 cups sugar</ingredient>
<ingredient>1 tbsp butter</ingredient>
</recipe>
</recipes>