2011-11-11 2 views
2

SimpleXml로 XML 파일을 생성하는 동안, 나는 challengefull 문제가있어.SimpleXml 및 Java를 사용하여 XML을 동적으로 생성하는 방법은 무엇입니까? 요소, ElementList 동적으로 임의의 위치에 나타납니다

동적 XML 출력을 다음과 같이 만들고 싶습니다.

<process> 
<sequence> ... </sequence> 
<flow> ... </flow> 
<sequence> ... </sequence> 
<flow> ... </flow> 
</process> 

질문은 SimpleXMl을 사용하여 스키마에서 어떻게 정의 할 수 있습니까?

<process> 
<sequence> ... </sequence> 
<sequence> ... </sequence> 
<flow> ... </flow> 
<flow> ... </flow> 
</process> 

어떻게해야합니까 :

지금, 그것은 항상 다음과 같은 형식으로 XML을 생성하고이 스키마에 따르면이 방법

@Root 
public class Process { 


    @ElementList(inline=true, required = false) 
    private List<Sequences> sequence; 

    @ElementList(inline=true, required = false) 
    private List<Flows> flow; 
    } 

에 보이는? 감사합니다.

답변

2

이것은 당신이 문서에서 사용해야하는 방법은 다음과 같습니다

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#scatter

행운을 빕니다. 인라인 요소를 산란


는 XML 문서가 인라인 목록 및 인라인지도에 의해 수집 할 수 있습니다 흩어져있다

요소 엔트리. 목록 또는 맵이 수집 할 XML 요소 이름의 항목 이름을 제공하면 추출되어 컬렉션 객체에 배치됩니다. 예를 들어, 다음 XML 요소를 취하십시오. 여기에는 특정 순서가 아닌 XML 요소가 포함되거나 제외됩니다. 비록 그들이 순서에 있지 않더라도 deserialization 프로세스는 XML 요소를 수집 할 수 있습니다.

이러한 목적을 달성하기 위해, 다음의 목적이 사용될 수있다. 이는 수집중인 항목 개체의 이름을 지정하는 두 개의 인라인 모음을 선언합니다. entry 속성이 지정되지 않으면 객체의 이름이 대신 사용됩니다.

@Root 
public class FileSet { 

    @ElementList(entry="include", inline=true) 
    private List<Match> include; 

    @ElementList(entry="exclude", inline=true) 
    private List<Match> exclude; 

    @Attribute 
    private File path; 

    private List<File> files; 

    public FileSet() { 
     this.files = new ArrayList<File>(); 
    } 

    @Commit 
    public void commit() { 
     scan(path); 
    } 

    private void scan(File path) { 
     File[] list = path.listFiles(); 

     for(File file : list) { 
     if(file.isDirectory()) { 
      scan(path); 
     } else {    
      if(matches(file)) { 
       files.add(file); 
      } 
     } 
     } 
    } 

    private boolean matches(File file) { 
     for(Match match : exclude) { 
     if(match.matches(file)) { 
      return false; 
     } 
     } 
     for(Match match : include) { 
     if(match.matches(file)) { 
      return true; 
     } 
     } 
     return false; 
    } 

    public List<File> getFiles() { 
     return files; 
    } 

    @Root 
    private static class Match { 

     @Attribute    
     private String pattern;    

     public boolean matches(File file) { 
     Stirng path = file.getPath(); 

     if(!file.isFile()) { 
      return false; 
     } 
     return path.matches(pattern);   
     }   
    } 
}