【问题标题】:XML parsing error related to char encoding setchar 编码集相关的 XML 解析错误
【发布时间】:2013-02-15 00:17:12
【问题描述】:

我有一个有效的 XML 文件(有效原因浏览器可以解析它),我尝试使用 JDOM2 解析它。该代码对其他 xml 文件运行良好,但对于这个特定的 xml 文件,它在 builder.build() 行上给了我以下异常:“com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 3 个 3 字节的 UTF-8 序列。"

我的代码如下

    import java.io.*;
    import java.util.*;
    import java.net.*;
    import org.jdom2.*;
    import org.jdom2.input.*;
    import org.jdom2.output.*;
    import org.jdom2.adapters.*;

    public class Test
    {
        public static void main(String st[])
        {
            String results="N.A.";
            SAXBuilder builder = new SAXBuilder();
            Document doc;
            results = scrapeSite().trim();

                    try
                    {
                        doc = builder.build(new ByteArrayInputStream(results.getBytes()));
                    }
                    catch(JDOMException e)
                    {
                        System.out.println(e.toString());
                    }
                    catch(IOException e)
                    {
                        System.out.println(e.toString());
                    }
        }


        public static String scrapeSite()
        {
            String temp="";
            try
            {
                URL url = new URL("http://msu-footprints.org/2011/Aditya/search_5.xml");
                URLConnection conn = url.openConnection();
                conn.setAllowUserInteraction(false);
                InputStream urlStream = url.openStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(urlStream));

                String t = br.readLine();
                while(t!=null)
                {
                    temp = temp + t;
                    t = br.readLine();
                }
            }
            catch(IOException e)
            {
                System.out.println(e.toString());
            }

            return temp;
        }
    }

【问题讨论】:

    标签: java character-encoding xml-parsing jdom-2


    【解决方案1】:

    你为什么要用 Reader 将 xml 读入字符串?在解析它之前,您正在破坏 xml。将 xml 视为字节,而不是字符。

    您为什么要阅读整个 URL InputStream 只是为了将其转换为另一个 ByteArrayInputStream?通过将 URL InputStream 直接传递给构建器,您可以将其减少到大约 2 行代码。 (更不用说避免因将整个流读入内存而引起的额外内存问题)。

    【讨论】:

    • 没错……我的流被破坏了……谢谢伙计!!
    【解决方案2】:

    正如 jtahlborn 所指出的,您应该始终将 XML 视为字节,让解析器进行编码。

    但更重要的是,你永远不应该使用 String.getBytes() 来获取字符串的字节:你不会得到你认为的那样。

    在这种情况下,您可以只获取站点的字节,但即使您在字符串中构造 XML,然后将其作为字节序列传递给解析器(或者,更有可能将字节写入文件) ,您可能希望指定编码,使其与 XML 所说的编码相匹配,默认情况下为 UTF-8:

    byte[] bytes = myString.getBytes("UTF-8");
    

    同样,如果由于某种原因需要使用 Writer 或 Reader,则必须指定要写入或读取的编码。

    如果需要构造XML,一个好办法是使用XMLStreamWriter类:

    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    XMLStreamWriter writer = 
       XMLOutputFactory.newInstance().createXMLStreamWriter(outStream);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多