2009-07-16 7 views
2

문서를 만드는 소프트웨어 (정확하게 베이지안 네트워크 그래프)를 만들고 있으며이 문서를 XML 형식으로 저장해야합니다.Java에서 xml 파일을 만드는 방법

XML 파일을 만드는 방법을 알고 있지만 코드를 구성하는 방법을 아직 결정하지 않았습니다.

현재 각 객체 (즉, 정점 또는 가장자리)에 getXML()이라는 함수가있을 계획입니다 (나중에 확장 할 수 있도록 인터페이스를 구현할 것입니다). getXML()은 해당 객체에 대한 XML을 포함하는 문자열을 반환합니다.

이 모든 XML 문자열을 수집하고 함께 모아서 XML 파일을 출력하는 또 다른 개체가 있습니다.

다소 혼란스러워 보입니다. 어떻게하는 것이 좋을까요?

답변

3

모델 (버텍스/EDGE) 는 표현에 (XML)를 사용해서는 안 :

Model model = new Model(); 
View view = model.getView(); // wrong 

올바른 방법은보기에서 (어떤 XStream을 또는 같은과) 모델을 분리 또는 단지를 만드는 것입니다 모델과 함께보기 :

Model model = new Model(); 
View view = new XMLView(model); // ok 
+1

+1 – kdgregory

0

그건 무리가 아닙니다. 나는 각 정점/가장자리를 통해 베이지안 네트워크 그래프 개체의 반복 처리를 할 것이다 및 중

  1. 는 XML에 대한 각 구성 요소를 요청하고 채워되는 XML 객체에 추가하거나
  2. 는하려면 - 수 - 인구 XML을 통과 구성 요소에 객체 (예 : DOM)를 삽입하고 각 구성 요소에 XML을 쓰도록하십시오.

전체 차트를 나타내는 객체가 있고 특정 XML 형식을 준수 할 필요가없는 객체 XStream을 보는 것보다 더 나쁠 수 있습니다. 이로 인해 많은 작업을 줄일 수 있습니다. 완벽한 자바 객체 그래프를 즉시 XML로 직렬화합니다.

+0

첫 번째 제안은 방문자 패턴입니까? – skaffman

+0

아닙니다. 방문객 패턴은 이중 위임이므로 일반성 질문에 대해서는 –

1

당신이 제안하는 무엇 넘김 single responsibility principle - 짧은 모델의 그냥이어야하고 XML 직렬화에 대해 알고는 안된다.

다른 개체에서 XML serialization을 수행하는 것이 훨씬 좋습니다.

+0

+1해야한다고 생각합니다. – kdgregory

+0

당신은 어떻게합니까? 버텍스 객체에 대한 다른 객체의 지식을 관리하고 XML에서 * 및 *로 렌더링합니다. 이를 달성하기 위해 Vertex 객체의 세부 사항을 알 필요가 없습니까? –

+0

@kdgregory doh, 지적 해 주셔서 고맙습니다. –

-1

XMLBeans를 사용하는 것이 좋습니다.
파서 및 포매터 빈을 사용하여 Jar 파일을 생성 할 수있는 도구/프레임 워크입니다. 단일 w3c 클래스를 만질 필요는 없습니다.
하지만 그 이유는 내가 그것을 권장하지 않습니다.

XML 형식의 문제는 형식이 변경되면 코드를 변경해야한다는 것입니다. 변경 사항을 놓친 경우 어떻게해야합니까? 런타임까지 알 수 없습니다.

XMLBeans는 컴파일시 문제가 나타나는 위치로 형식 변경을 이동합니다. 형식 (XSD)에 대한 계약을 정의한다는 의미에서 XMLBeans를 사용하여 파서/포맷터/검증자를 빌드합니다. 나머지는 IDE에 달렸습니다.

그리고 기본적으로 XMLBeans의 설계와 같은 사운드 디자인을 생각해보십시오.

1

또 다른 제안 : XMLEncoder을 사용하고 비 bean 스타일 객체에 대해 필요한 PersistenceDelegate 클래스를 작성하십시오. 예 :

static class FilePersistenceDelegate extends PersistenceDelegate { 
    protected Expression instantiate(Object oldInstance, Encoder out) { 
     File file = (File)oldInstance; 
     return new Expression(oldInstance, oldInstance.getClass(), "new", new Object[]{ file.getPath() }); 
    } 
} 

같은 것을 할 것 실제 인코딩을 수행 할 수있는 내 코드 : 나는 제 3의 라이브러리에 대한 종속성을 생성하지 않으려는 경우

XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(file)))); 

    for (Map.Entry<Class<?>, PersistenceDelegate> entry : MY_DELEGATES.entrySet()) { 
     // Add any custom persistence delegates written. 
     encoder.setPersistenceDelegate(entry.getKey(), entry.getValue()); 
    } 

    encoder.writeObject(object); 
    encoder.close(); 

    if (encoder.getException() != null) { 
     // Encoding failed. 
    } 

나는 일반적으로 경량 응용 프로그램에 대해서도이 방법을 사용할 것 내 도메인 모델은 비교적 간단합니다.

+0

왜 이것을 투표합니까? 이는 합법적 인 접근 방식이며 대리자를 사용하여 XML 표현과 모델을 완전히 분리합니다. – Adamski

+0

동의 - 왜 이것이 투표에서 내게되었습니다. –

1

Java을 사용해야합니까? 스칼라에는 모델 개체를 원하는 뷰 표현으로 암시 적으로 변환 할 수있는 암시 적 유형 변환이 포함되어 있습니다. 또한 Java와 완벽하게 호환됩니다. 예를 들면 : 당신이 trait (즉, interface)

trait ViewRepresentation { 
    def printTo(os: OutputStream) 
} 

그리고 암시 적 변환이

def printData(obj: DataObject, os: OutputStream) = { 

    val view: ViewRepresentation = obj //note implicit conversion 
    view.printTo(os) 
} 

:

implicit def dataobj2xmlviewrep(obj: DataObject): ViewRepresentation = { 
    new XmlViewRepresentation(obj) 
} 

당신은 단지 맞춤 XML 표현을 코딩해야합니다. 아, 네 - 다른 사람에 의해 주어진 옵션 외에도, 당신은 JAXB와 StAX를 시도 할 수

+0

거기에 쓸데없는 스칼라 비트가 있습니다! –

+0

Java가 있어야하며, 개인 프로젝트가 아니며, 스펙에는 Java가 필요합니다. – saralk

0

그것은 언어의 네이티브 XML 지원이 :

  • 당신은 위해 XML 스키마 객체를 매핑 JAXB를 사용할 수 있습니다 마술처럼 XML 문서를 입력하고 출력 할 수 있습니다.
  • 당신은 당신의 낮은 수준에 맞는 기본적인 방식으로 XML 문서를 읽고 쓰는 경우 StAX를 사용할 수있는이 두 옵션 아름다움들이 자바 (JAXP)하고의 일부로 제공한다는 것입니다

필요 물론 더 나은 옵션이 존재하지 않는 한, 잘 작동하는 것 같습니다!

관련 문제