2012-12-03 2 views
4

이것은 나를 미치게합니다. 나는 많은 다른 프로젝트를 위해이 코드를 사용했다. 그러나 이것이 나에게 이런 유형의 에러를주는 것은 처음이다.SAXException : 내용이 뒷부분에 허용되지 않습니다.

public static Xml parse(String xmlString) 
    { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     Document doc = null; 
     //System.out.print(xmlString); 
     try 
     { 
      doc = dbf.newDocumentBuilder().parse(
        new InputSource(new StringReader(xmlString))); 
      // Get root element... 
      Node rootNode = (Element) doc.getDocumentElement(); 
      return getXmlFromNode(rootNode); 
     } catch (ParserConfigurationException e) 
     { 
      System.out.println("ParserConfigurationException in Xml.parse"); 
      e.printStackTrace(); 
     } catch (SAXException e) 
     { 
      System.out.println("SAXException in Xml.parse "); 
      e.printStackTrace(); 
     } catch (IOException e) 
     { 
      System.out.println("IOException in Xml.parse"); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

나는 문맥 : 여기

<layers> 
    <layer name="Layer 1" h="400" w="272" z="0" y="98" x="268"/> 
    <layer name="Layer 0" h="355" w="600" z="0" y="287" x="631"/> 
    </layers> 

그것으로 공급되는 XML을 구문 분석의 DocumentBuilderFactory를 사용하여 내 사제 XML 클래스의 코드 수술 비트가이 전체 XML 파일입니다 이것을 사용하면 : 포토샵 형식의 이미지 조작 응용 프로그램을 제작하는 학교 프로젝트입니다. 파일은 레이어와 함께 .png 파일로 저장되며이 xml 파일은 .zip 파일의 레이어 위치 등에 저장됩니다. 지퍼로 인해 신비스러운 추가 문자가 추가되는지 여부는 알 수 없습니다.

의견을 보내 주셔서 감사합니다.

+1

게시 한 내용이 실제로 XML 파일의 내용인지 100 % 확신합니까? 당신의 디버거는'xmlString' 변수의 내용에 대해 무엇을 말합니까? 아마도 루트 요소가 여러 개입니까? 또한'xmlString'의 내용을 생성하는 코드를 게시 할 수도 있습니다. – predi

+0

이 질문과 대답에 감사드립니다. 나는 GenericJam에 동의한다 - 이것은 버퍼와 관련이있다. 기본적으로 모든 바이트는 0이고 'zipFile.getInputStream (xmlZipFile) .read (buffer)'에 대한 호출은이 바이트의 첫 번째 'n'을 덮어 씁니다. 그러나 후행 0 바이트는 XML 문서에서 '내용'으로 간주됩니다. – welterw8

답변

5

누군가가 도움이 될 수 있기를 바랍니다. 수정 된 부분은 lastIndexOf()를 부분 문자열과 함께 사용하는 것입니다.

public void loadFile(File m_imageFile) 
{ 
    try 
    { 
    ZipFile zipFile = new ZipFile(m_imageFile); 

    ZipEntry xmlZipFile = zipFile.getEntry("xml"); 

    byte[] buffer = new byte[10000]; 
    zipFile.getInputStream(xmlZipFile).read(buffer); 
    String xmlString = new String(buffer); 
    Xml xmlRoot = Xml.parse(xmlString.substring(0, xmlString.lastIndexOf('>')+1)); 
    for(List<Xml> iter = xmlRoot.getNestedXml(); iter != null; iter = iter.next()) 
    { 
     String layerName = iter.element().getAttributes().getValueByName("name"); 
     m_view.getCanvasPanel().getLayers().add( 
      new Layer(ImageIO.read(zipFile.getInputStream(zipFile.getEntry(layerName))), 
       Integer.valueOf(iter.element().getAttributes().getValueByName("x")), 
       Integer.valueOf(iter.element().getAttributes().getValueByName("y")), 
       Integer.valueOf(iter.element().getAttributes().getValueByName("w")), 
       Integer.valueOf(iter.element().getAttributes().getValueByName("h")), 
       Integer.valueOf(iter.element().getAttributes().getValueByName("z")), 
       iter.element().getAttributes().getValueByName("name")) 
     ); 
    } 
    zipFile.close(); 
    } catch (FileNotFoundException e) 
    { 
    System.out.println("FileNotFoundException in MainController.loadFile()"); 
    e.printStackTrace(); 
    } catch (IOException e) 
    { 
     System.out.println("IOException in MainController.loadFile()"); 
     e.printStackTrace(); 
    } 

} 기여한 모든 사람들을위한

감사 : 여기에 현장의 코드입니다. 오류가 zip 프로세스에서 도입되었거나 byte [] 버퍼를 사용하여 발생한 것으로 의심됩니다. 더 이상의 피드백을 부탁드립니다.

9

편집기에서 해당 파일을 보면 최종 요소 뒤에 공백 (예 : 공백)이 표시됩니다.

</layers> <-- after here 

공백 문자를 강조 표시하는 도구를 사용하여이를 버릴 가치가 있습니다.

$ cat -v -e my.xml 

은 '인쇄 할 수없는'문자를 덤프합니다.

+0

String.trim() 등을 사용하여 ">"가 마지막 문자인지 확인하려고했습니다. 파서의 오류 메시지는 오류가 해당 위치에 있음을 나타냅니다 (">"자체). – GenericJam

+0

@GenericJam trim()은 공백을 제거합니다. 말미의 문자가 공백으로 간주되지 않는 경우,이 메서드는 아무것도하지 않습니다. – predi

+0

@Brain Agnew, 간단한 JSP를 "ABC"텍스트 (AJAX 응답으로 선행 및 후행 공백 없음)로 반환하더라도 동일한 오류가 발생합니다. 제발 변경 사항을 제안하십시오 – masT

0

나는 Sterling Integrator에서이 오류가 발생했습니다. 16 진수 편집기 에서이 파일을 보았을 때 공백이 아닌 char (0)이 약 5 줄 더 추가되었습니다. 그들이 어디에서 왔는지는 모르지만 이것은 정확하게 문제였습니다. 특히 기본적으로 단일 변환을 수행 할 때 xsl 엔진 (이 경우 xalan)이 분명히 결과로 전달되었습니다. 마지막 꺽쇠 괄호 뒤에 추가 행을 제거하여 문제가 해결되었습니다.

0

XML 끝 부분에 약간의 문자가 있었거나 XML을 올바르게 확인하거나 XML의 온라인 형식을 사용하면 XML이 적절하지 않으면 오류가 발생합니다. 내가 사용했다 Online XML Formatter

관련 문제