Java 序列化时处理无效的xml字符

Java 序列化时处理无效的xml字符,java,xml,Java,Xml,我需要序列化一个包含字符串的文档,如ンᅧᅭ%ンᅨ&。序列化时会引发以下异常: java.io.IOException: The character '' is an invalid XML character 编辑:我把你的问题理解为反序列化问题,而不是序列化问题。对不起 答案是需要使用Uuicode实体转义字符串转义它们 字符ン变成和#12477。看 在这里也可以看到 您需要预处理文件以正确转义xml字符 读取文件中的每个字符 如果字符是无效的xml 将字符写入临时文件 在原始文件末尾

我需要序列化一个包含字符串的文档,如
ンᅧᅭ%ンᅨ&。序列化时会引发以下异常:

java.io.IOException: The character '' is an invalid XML character
编辑:我把你的问题理解为反序列化问题,而不是序列化问题。对不起

答案是需要使用Uuicode实体转义字符串转义它们

字符<代码>ン变成
和#12477。看

在这里也可以看到


您需要预处理文件以正确转义xml字符

  • 读取文件中的每个字符
  • 如果字符是无效的xml
  • 将字符写入临时文件
  • 在原始文件末尾,使用临时文件覆盖原始文件

  • 您的文件现在是有效的xml,可以通过标准方式进行解析。它很可能会更大。给文件供应商一个关于编写错误xml编写器的警告;)

    无法序列化该字符。请注意,如果我在internet explorer中打开该xml,我就能正确地看到它。这意味着包含这种字符的xml是一个有效的xml文件,但为什么它在序列化它时抛出无效的xml字符呢。我的问题是,一定有某种方法可以序列化这些字符,因为我已经在xml文件中编写了这些字符,并用Internet explorer打开了该xml文件,它工作得很好。它显示了xml。如果这些是无效的xml字符,那么为什么Internet Explorer可以显示它。@Abhishek“无法序列化该字符”-你确定吗?此外,还有片假名字符的unicode实体。是片假名吗?我没有办法也没有把握。我们如何才能逃避它,我使用了字符串xml=”ンᅧᅭ%ンᅨ\\&;“;在上面的代码中,但它仍然抛出相同的exception.Characterン 变成ソ不是问题,此字符正在正确序列化。我进一步调试并发现,在该字符串中,0x00000019字符是一个问题(我无法在此处复制粘贴该字符)。这个角色就在&;在这个字符串中ンᅧᅭ%ンᅨ&;(如果您在eclipse中键入此字符串,您应该能够看到该字符。它类似于框中的问号。)这是哪种语言?您可以尝试不同的编码而不是UTF-8。这里有一个列表,您可以尝试:。
    StringWriter stringOut = new StringWriter();
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    Document doc = docBuilder.newDocument();
    Element rootElement = doc.createElement("company");
    doc.appendChild(rootElement);
    String xml = "ンᅧᅭ%ンᅨ&amp;";
    //String xml = "ンᅧᅭ%ンᅨ&amp;";
    Element junk = doc.createElement("replyToQ");
    junk.appendChild(doc.createCDATASection(xml));
    //junk.appendChild(doc.createTextNode(stripNonValidXMLCharacters(xml)));
    rootElement.appendChild(junk);
    
    //org.w3c.dom.Document doc = this.toDOM();
    
    //Serialize DOM
    OutputFormat    format  = new OutputFormat(doc,"UTF-8",true);
    format.setIndenting(false);
    format.setLineSeparator("");
    format.setPreserveSpace(true);
    format.setOmitXMLDeclaration(false);
    
    XMLSerializer    serial = new XMLSerializer( stringOut, format );
    // As a DOM Serializer
    serial.asDOMSerializer();
    
    serial.serialize( doc.getDocumentElement() );