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>

DocumentBuilderFactory を使用して、入力された Xml を解析する自作 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

そのファイルをエディターで見ると、end要素の後にコンテンツ(おそらく空白)が表示されます。

</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 に答える
0

Sterling Integrator でこのエラーが発生しました。16 進エディターでファイルを確認すると、スペースではなく、約 5 行の char(0) が追加されていました。それらがどこから来たのかはわかりませんが、これはまさに問題でした。特に基本的にユニティ変換を行っていたため、xsl エンジン (この場合は xalan) が明らかにそれを結果に渡していました。最後の閉じ山かっこの後の余分な行を削除し、問題を解決しました。

于 2013-11-18T05:58:09.120 に答える