1

我有一个有效的 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;
        }
    }
4

2 回答 2

1

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

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

于 2013-02-15T00:44:47.077 回答
0

正如 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);
于 2013-03-02T13:26:46.713 回答