2012-03-18 1 views
1

XML에 파일을 쓰는 데 문제가 있습니다. 다음은이 요소가 xsd에서 어떻게 보이는지입니다. 여기 STAX를 사용하여 XML에 파일을 쓰는 방법은 무엇입니까?

<xs:element name="File"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:base64Binary"> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 

이 작성하는 내 방법 :

 private void writeFile (XMLStreamWriter2 sw, final InputStream is){ 
//is - inputstream from file 
      try { 
       OutputStream output = null; 
       InputStream input = new Base64InputStream(is, true); 
       int count; 

        int BUFFER_SIZE = 4000; 
        byte[] buffer = new byte[BUFFER_SIZE]; 
        output = new FileOutputStream(new File("D:\\test.txt")); 
        while ((count = input.read(buffer)) != -1) { 

          output.write(buffer, 0, count); 
          sw.writeBinary(buffer, 0, count); 

        } 
        is.close(); 
        input.close(); 
        output.close(); 
      } catch (XMLStreamException ex) { 
       Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

있는 test.txt의 내용은 유효 기본-64 문자열, File XML 요소 파일의 내용이 아니지만 (내가 http://www.opinionatedgeek.com/dotnet/tools/base64decode/으로 확인 해요). 이것을 사용하려고,하지만 난 캐리지 리턴 문자 #xd;

private void writeFile (XMLStreamWriter sw, InputStream is){ 
    //is - FileInputStream 
    Reader reader = new InputStreamReader(new Base64InputStream(is, true)); 
    char[] buf = new char[4096]; 
    int n; 

     while((n = reader.read(buf)) >= 0) { 
       sw.writeCharacters(buf, 0, n-3); 
     } 
} 

편집 방법을 많이받을 이유

편집 :

writeRaw(char[] chars, int i, int i1) 

잘 작동합니다. 이상하지만, woodstox의 readElementAsBinary은 나를 위해 base64를 읽고 디코드합니다. 왜 writeBinary은 유효한 base64를 쓰지 않습니까? 어쨌든, 너에게 skaffman 고마워, ! 너는 최고야!

+1

는'writeBinary'는 Woodstox STAX 구현에 고유의 방법이며, 같은 당신이 정말로 그것을를 사용하지 않아야합니다. 표준'XMLStreamWriter' 인터페이스를 고수하십시오. – skaffman

+0

와우 감사합니다. 하지만 스트림에서 작성하는 방법은 무엇입니까? 'writeCharacters (char [] text, int start, int len)를 사용하여'??? – bunnyjesse112

+1

예. XML은 문자 데이터만을 나타낼 수 있으므로, base64로 인코딩 된 바이너리 데이터를 문자 데이터로 쓰려면 직접 인코딩해야합니다. Woodstox의'writeBinary'는 고성능 웹 서비스 지원 (예 : Fast Infoset)을위한 것으로, 실제로 무엇을하는지 모르는 경우에는 피해야합니다. – skaffman

답변

1

을 (복사/XML을 향해 텍스트 파일을 붙여 넣기), InputStream 인 직접입니다 사용 나는 당신이 아파치 코 몬즈 코덱에서 Base64InputStream를 사용하는 가정합니다. 또한 줄 바꿈을 완전히 해제하는 데 사용할 수있는 네 개의 인수가있는 생성자를 제공합니다. 질문에서 방법을 조정 이 같은 유효한 Base64로 출력을 작성할 수 있습니다

private void writeFile (XMLStreamWriter sw, InputStream is){ 
    //is - FileInputStream 
    Reader reader = new InputStreamReader(new Base64InputStream(is, true, -1, null)); 
    char[] buf = new char[4096]; 
    int n; 
    while((n = reader.read(buf)) >= 0) { 
     sw.writeCharacters(buf, 0, n); 
    } 
} 
0

Base64InputStream의 javadoc에 기반 : 생성자 (InputStream in, boolean doEncode)에 두 개의 매개 변수를 제공하면 은 제공된 모든 데이터가 Base64 인코딩되거나 Base64로 디코딩 된 Base64InputStream을 생성합니다 InputStream.doEncode - 우리가 읽은 모든 데이터를 인코딩해야하는 경우 true이고, 디코딩해야하는 경우 false입니다.

나는 당신의 기능이 무엇을해야하는지 확실하지 않다 때문에, 나는 단지이 정찰 할 수 있습니다

  • 을 중 하나는
  • false로 doEncode를 돌 수 있었다 (XML 파일의 디코딩 텍스트를 저장하는) 또는 단순히
+0

답변 해 주셔서 감사합니다. xml (xsd requirment)에 인코딩 된 텍스트를 저장해야합니다. 나는 왜 test.txt가 ok인지, XML 내용은 그렇지 않은지 이해할 수 없다. – bunnyjesse112

+0

입력 스트림 입력 변경 = new Base64InputStream (is, true); ~ InputStream 입력 =입니다. –

+0

변경됨, 생성 된 XML, 파일 요소의 복사 된 텍스트가 온라인 디코더에 붙여 넣어 짐, '기본 64 이외의 문자, 2 개 이상의 패딩 문자 또는 패딩 문자 중 비 공백 문자. ' – bunnyjesse112