Java xmlbeans.xmlexception。非法的XML字符0x0

Java xmlbeans.xmlexception。非法的XML字符0x0,java,parsing,bytearray,xmlbeans,xmlexception,Java,Parsing,Bytearray,Xmlbeans,Xmlexception,我通过System.Text.UTF8Encoding()将字符串转换为字节,在C#中创建了一个xml文档。然后我将其发送到我的java程序,以便xmlbeans通过TCP连接进行解析。无论我尝试什么,我都会遇到以下错误: org.apache.xmlbeans.XmlException:错误:非法XML字符:0x0 org.apache.xmlbeans.impl.piccolo.io.IllegalCharException:非法XML字符:0x0 我试图清理C#端的字符串,但未找到任何0x

我通过System.Text.UTF8Encoding()将字符串转换为字节,在C#中创建了一个xml文档。然后我将其发送到我的java程序,以便xmlbeans通过TCP连接进行解析。无论我尝试什么,我都会遇到以下错误: org.apache.xmlbeans.XmlException:错误:非法XML字符:0x0 org.apache.xmlbeans.impl.piccolo.io.IllegalCharException:非法XML字符:0x0

我试图清理C#端的字符串,但未找到任何0x0实例。我已经循环并输出了在java端接收到的字节[]中的每个字节,绝对没有任何字节是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();
        }
}

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

我碰巧发现lib文件已损坏,所以请用未损坏或旧的副本替换lib。它解决了我的问题。

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

你可以更改字符串foundData=新字符串(字节);to String foundData=新字符串(字节,Charset.UTF-8);我可以,但那又有什么区别呢?我引用它只是为了查找字符串?我从来没有真正将foundData传递给我的parseXml函数。能否将xml写入c#格式的文件,并查看文件的开头或结尾是否有其他字符。或者,您可以嗅探网络字节,查看空字符isI使用system.io.file.writealltext将数据写入的位置。我只做了一次,没有指定编码,只做了一次。他们俩都很般配。我还使用二进制编写器写出了hte字节。这些都没有显示前导或尾随的空字符。我去看看能不能在什么地方找到wireshark看看。我怀疑数据中是否真的有空值,至少是来自我的C#端。您可以将接收到的字节写入一个文件,并选中toocan u change String foundData=new String(字节);to String foundData=新字符串(字节,Charset.UTF-8);我可以,但那又有什么区别呢?我引用它只是为了查找字符串?我从来没有真正将foundData传递给我的parseXml函数。能否将xml写入c#格式的文件,并查看文件的开头或结尾是否有其他字符。或者,您可以嗅探网络字节,查看空字符isI使用system.io.file.writealltext将数据写入的位置。我只做了一次,没有指定编码,只做了一次。他们俩都很般配。我还使用二进制编写器写出了hte字节。这些都没有显示前导或尾随的空字符。我去看看能不能在什么地方找到wireshark看看。我怀疑数据中是否真的存在空值,至少是来自我的C#端。您可以将接收到的字节写入文件并进行检查
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();
        }
}