Java:如何在XML中存储Vector <string []>(或以任何其他方式保存)</string []>

时间:2010-04-26 23:17:41

标签: java xml arrays vector save

基本上我有一个概念验证应用程序,它是一本数字食谱书。每个配方都是一个对象,每个对象都包含一个包含数组的Vector。 Vector是食谱中所有成分的列表,而每种成分都有一个数组,显示成分的名称,数量和该数量的单位。我想将每个Recipe保存为XML,以便用户可以访问它们。如何在XML或任何其他类型的文件中存储String of String数组,以便以后可以调用和访问它?

3 个答案:

答案 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中获得所需的内容。

您可以通过编写

将对象序列化为XML
String 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>