2012-12-03 71 views
4

这让我疯狂。我已经将这些代码用于很多不同的项目,但这是第一次给我这种类型的错误。这是整个XML文件:SAXException:内容不允许在尾部

<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的代码手术位:

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; 
    } 

,我上下文使用它是:学校项目生产一个Photoshop类型的图像处理应用程序。该文件将以图层的形式保存为.png,并将该xml文件保存为.zip文件中图层的位置等。我不知道压缩是否添加了一些神秘的额外字符。

我感谢您的反馈。

+1

你是否100%确定你发布的内容确实是你的XML文件的内容?你的调试器对xmlString变量的内容有什么看法?你可能有多个根元素?您也可能想要发布生成'xmlString'内容的代码。 – predi

+0

感谢您的回答。我同意GenericJam - 它与缓冲区有关。默认情况下,所有字节都是0(零),对'zipFile.getInputStream(xmlZipFile).read(buffer)'的调用将覆盖这些字节的第一个'n'。但是,在XML文档中,尾随的0字节将被视为“内容”。 – 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中出现这个错误 - 当我用十六进制编辑器查看文件 时,它有大约5行额外的char(0),而不是空格。不知道他们从哪里来,但这正是问题所在,特别是因为我基本上正在进行统一转换,所以xsl引擎 - 在这种情况下xalan - 显然将它传递给结果。在最后一个关角支架后删除了多余的行,解决了问题。

0

我在XML的末尾添加了一些额外的字符,正确地检查XML或者执行XML的在线格式,如果XML不正确,会导致错误。我用 Online XML Formatter