2010-04-26 2 views
1

기본적으로 디지털 개념 책인 개념 증명 응용 프로그램이 있습니다. 각 레서피는 하나의 객체이며 각 객체는 다른 필드 중에서도 배열이 들어있는 Vector를 포함합니다. 벡터는 레시피의 모든 성분 목록이며 각 성분은 성분의 이름, 양 및 그 양의 단위를 보여주는 배열을 가지고 있습니다. 각 레서피를 XML로 저장하여 사용자가 액세스 할 수있게하려고합니다. XML 또는 다른 종류의 파일에 String Array의 Vector를 저장하여 나중에 불러와 액세스 할 수 있도록하려면 어떻게해야합니까?Java : 벡터 <String[]>을 XML로 저장하는 방법 (또는 다른 방법으로 저장)

+2

http://java.sun.com/developer/technicalArticles/Programming/serialization/ – Searles

답변

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>"); 

이러한 방법의 문제는 당신이를 수정할 때이다 기본 데이터 구조 (경우에 따라 배열 벡터 인 경우 XML 생성 코드를 수정하여 일치하지 않는 XML을 생성해야합니다 (종종 잘못된 XML로 연결됨)

XML 라이브러리를 사용하여 XML을 생성하는 것이 좋습니다. 훌륭한 XML 라이브러리는 항상 유효한 XML을 생성합니다. 2.2.3 절에 특히주의를 기울여 http://docstore.mik.ua/orelly/xml/sax2/ch02_02.htm에서 DOM XMLWriter가의 표정으로 무엇이 가능한지에 대한보다 완전한 설명은

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에서 XML로 변환 할 수도 있지만 DOM을 사용하면 데이터 구조의 DOM 표현을 작성해야한다는 것을 의미합니다. 이는 아마도 불필요하고 환영받지 못하는 추가 단계 일 것입니다.

문자열 배열의 벡터와 같은 것으로 시작할 수도 있지만 이러한 데이터 구조는 실제 제조법과 관련이 거의 없습니다. 장기적으로는 성분 및 지침 (차례로 단계가 포함되어 있음)에 대한 수업을 포함하는 클래스 Recipie를 사용하는 것이 더 나을 것입니다. 3 가지 또는 4 가지 유형의 수업을 배치하는 것이 더 많은 작업처럼 보일 수 있지만,이 작업은 프로그램의 마지막 10 %를 완료하는 데 10 배 이상의 동일한 작업량을 절약합니다.

"빠른"개념 증명의 경우에도 실제로 설명적인 데이터 구조를 사용하면 시간을 절약 할 수 있습니다. 개념 증명이 곧 실제 프로토 타입의 기초가 될 수있는 시작 프로토 타입이 될 수 있습니다.

행운을 빈다.

2

성분을 실제 오브젝트로 모델링하지 않는 이유는 무엇입니까? 그런 다음 자신의 하위 요소 나 이름, 양, 단위 등의 속성을 가진 Recipe 아래에 일련의 Ingredient 요소가 있습니다.

+0

에서 프로그램을 작동시키는 방식 때문에 배열의 Vector를 구현하는 것이 훨씬 쉽습니다. 주로 얼마나 많은 성분이 각 조리법에 필요할 지 모른다는 사실 때문입니다. 이상적으로는 응용 프로그램의 구조를 변경하지 않아도되는이 질문에 대한 답변을 원합니다. –

+0

xml 스키마가 n 개의 성분을 허용하도록 만들 수 있습니다. 사전에 알 필요가 없습니다. 문자열 내부에 실제 도메인 객체를 인코딩하는 것은 제 의견으로는 진짜 코드 냄새입니다. –

0

XStream을 사용할 수 있습니다. 기본적으로 출력이 좋으며 매우 유연하여 XML에서 원하는 것을 얻을 수 있습니다.

당신은 구조에 관해서는

String xml = XStream.toXML(myObject); 

를 작성하여 개체를 XML로 직렬화 할 수

, 당신은 사전에 양을 모를 때 벡터와 목록을 계속 사용할 수 있지만, 그것은을 사용하는 것이 좋습니다 문자열 배열이 아닌 도메인 객체 (Recipes, Ingredients 등) 목록. XStream을 사용하면 XML로 가져 오기 위해 모든 것을 문자열로 만들 필요가 없습니다.

변경 사항없이 모든 것을 그대로 유지하려는 경우 기본 XStream 비헤이비어가 원하는 것을 제공하지 않을 수 있습니다. 어떤 Strings가 요리법, 재료 등인지는 알 수 없습니다.이 경우에는 좀 더 작성해야합니다. 예를 들어,이 코드는 파일 "recipes.txt"에 재료와 조리법 등의 벡터를 기록 : 출력 될 것 벡터

Vector<String[]> v = new Vector<String[]>(); 
v.add("2 cups pasta", "1 onion"); 
v.add("2 eggs", "1.5 cups sugar", "1 tbsp butter"); 

를 들어

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(); 

<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> 
관련 문제