2011-09-30 89 views
2

我在C#中通过System.Text.UTF8Encoding()将字符串转换为字节来创建xml文档。然后,我发送这个到我的Java程序的xmlbeans通过TCP连接解析。无论我尝试什么,我收到此错误: org.apache.xmlbeans.XmlException:错误:非法XML字符:0x0 org.apache.xmlbeans.impl.piccolo.io.IllegalCharException:非法XML字符:0x0xmlbeans.xmlexception。非法XML字符0x0

我试图清理C#端的字符串,但它没有找到任何0x0的实例。我已经循环并输出了我在java端收到的byte []中的每个字节,并且绝对没有任何内容为0x0。

这是我的Java端代码:

public void parseBytes(byte[] bytes, int length, String source) 
{ 
    System.out.println("***************BmsDrawingGatewayParser - ParseBytes " + length);   

    String foundData = null; 
    try 
    { 
     foundData = new String(bytes, 0, length, "UTF-8"); 
    } 
    catch (UnsupportedEncodingException e1) 
    { 
     e1.printStackTrace(); 
    } 
    switch (readState) 
    {    
    case STATE_NEW_MSG: 
     // if contains the 
     if (foundData.contains(startMessageTag)) 
     { 
      if (foundData.contains(endMessageTag)) 
      { 
       byteStream.write(bytes, 0, length);     
       parseXml(byteStream.toByteArray()); 
       if (byteStream.size() > 0) 
       { 
        byteStream.reset(); 
       } 
      } 
      else 
      {      
       readState = DrawingDeviceParserState.STATE_READING_MSG; 
      }     
     } 
     else 
     { 
      System.out.println("Couldn't find start tag"); 
      System.out.println(foundData); 
     } 
     break; 

    case STATE_READING_MSG:   
     byteStream.write(bytes, byteStream.size(), length); 
     if (foundData.contains(endMessageTag)) 
     { 
      System.out.println("Now going to parse"); 
      //parseXml(xmlString.toString()); 
      parseXml(byteStream.toByteArray()); 
      byteStream.reset(); 
      readState = DrawingDeviceParserState.STATE_NEW_MSG; 
     } 
     else 
     { 
      System.out.println("Couldn't find end tag"); 
      System.out.println(foundData); 
     } 
     break; 
    }       
} 

    private void parseXml(byte[] xmlData) 
    { 
     System.out.println(xmlData); 

     //EventDocument.Factory.parse 
     ByteArrayInputStream sid = new ByteArrayInputStream(xmlData);  
     try 
     { 
      EventDocument eventDoc = EventDocument.Factory.parse(sid); 
      if (eventDoc.validate()) 
      { 
       System.out.println("Document is valid"); 
      } 
      else 
      { 
       System.out.println("Document is INVALID"); 
      } 
      EventDocument.Event myEvent = eventDoc.getEvent(); 
      EventDocument.Event.Detail[] myDetailArray = myEvent.getDetailArray(); 

      //myDetailArray[0]. 

      //BmsDrawingDocument drawingDoc = myEvent.getDetail(); 
      System.out.println("MY UID: " + myEvent.getUid()); 
     } 
     catch(Exception xmlException) 
     { 
      System.out.println(xmlException.toString()); 
      xmlException.printStackTrace(); 
     } 
} 

有谁知道我可能是做错了什么?我能提供更多信息吗?

+0

可以更改String foundData = new String(bytes); to String foundData = new String(bytes,Charset.UTF-8); –

+0

我可以,但是会有什么不同?我只参考它,所以我可以寻找一个字符串?我从来没有实际上将foundData传递给我的parseXml函数。 – Jason

+0

你可以写xml到c#中的文件,看看你是否在文件的开始或结尾有附加字符。或者您可以嗅探网络字节来查看空字符的位置 –

回答

-1
public void parseBytes(byte[] bytes, int length, String source) 
{    
    String foundData = null; 
    try 
    { 
     foundData = new String(bytes, 0, length, "UTF-8"); 
    } 
    catch (UnsupportedEncodingException e1) 
    { 
     e1.printStackTrace(); 
    } 
    switch (readState) 
    {    
    case STATE_NEW_MSG: 
     // if contains the 
     if (foundData.contains(startMessageTag)) 
     { 
      if (foundData.contains(endMessageTag)) 
      { 
       byteStream.write(bytes, 0, length);     
       parseXml(byteStream.toByteArray()); 
       if (byteStream.size() > 0) 
       { 
        byteStream.reset(); 
       } 
      } 
      else 
      {      
       readState = DrawingDeviceParserState.STATE_READING_MSG; 
      }     
     } 
     else 
     { 
      System.out.println("Couldn't find start tag"); 
      System.out.println(foundData); 
     } 
     break; 

    case STATE_READING_MSG:   
     byteStream.write(bytes, byteStream.size(), length); 
     if (foundData.contains(endMessageTag)) 
     { 
      System.out.println("Now going to parse"); 
      //parseXml(xmlString.toString()); 
      parseXml(byteStream.toByteArray()); 
      byteStream.reset(); 
      readState = DrawingDeviceParserState.STATE_NEW_MSG; 
     } 
     else 
     { 
      System.out.println("Couldn't find end tag"); 
      System.out.println(foundData); 
     } 
     break; 
    }       
} 

    private void parseXml(byte[] xmlData) 
    { 
     System.out.println(xmlData); 

     //EventDocument.Factory.parse 
     ByteArrayInputStream sid = new ByteArrayInputStream(xmlData);  
     try 
     { 
      EventDocument eventDoc = EventDocument.Factory.parse(sid); 
      if (eventDoc.validate()) 
      { 
       System.out.println("Document is valid"); 
      } 
      else 
      { 
       System.out.println("Document is INVALID"); 
      } 
      EventDocument.Event myEvent = eventDoc.getEvent(); 
      EventDocument.Event.Detail[] myDetailArray = myEvent.getDetailArray(); 

      //myDetailArray[0]. 

      //BmsDrawingDocument drawingDoc = myEvent.getDetail(); 
      System.out.println("MY UID: " + myEvent.getUid()); 
     } 
     catch(Exception xmlException) 
     { 
      System.out.println(xmlException.toString()); 
      xmlException.printStackTrace(); 
     } 
} 
0

它发生在我身上,发现是损坏的lib文件,所以用未损坏的或旧的副本替换libs。它解决了我的问题。