6

这真让我抓狂。我已经将这段代码用于许多不同的项目,但这是第一次给我这种类型的错误。这是整个 XML 文件:

  <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 文件中图层的位置等。我不知道压缩是否添加了一些神秘的额外字符。

感谢您的反馈。

4

4 回答 4

14

如果您在编辑器中查看该文件,您会在结束元素之后看到内容(可能是空格),例如

</layers>  <-- after here

值得使用可以突出显示空白字符的工具将其丢弃,例如

$ cat -v -e my.xml

将转储“不可打印”的字符。

于 2012-12-03T11:57:36.380 回答
7

希望这可以在某些时候对某人有所帮助。有效的修复只是将 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[] 缓冲区引入的。任何进一步的反馈表示赞赏。

于 2012-12-03T19:08:28.253 回答
2

我在 XML 的末尾有一些额外的字符,正确检查 XML 或执行 XML 的在线格式,如果 XML 不正确,这将引发错误。我使用 了在线 XML 格式化程序

于 2017-01-11T13:38:28.260 回答
0

我刚刚在 Sterling Integrator 中遇到了这个错误——当我在十六进制编辑器中查看文件时,它有大约 5 行额外的 char(0) 行,而不是空格。不知道它们来自哪里,但这正是问题所在,尤其是当我基本上是在进行统一转换时,所以 xsl 引擎(在本例中为 xalan)显然将其传递到结果中。在最后一个闭合尖括号之后删除了额外的行,问题解决了。

于 2013-11-18T05:58:09.120 回答