我是http将一个xml文件发布到servlet,目前正在执行:
String xmlString = request.getParameter("xml");
然后我在xml的SAX解析期间将xml字符串变量转换为StringReader和InputSource。
parser.parse(new InputSource(new StringReader(xmlString)));
我很好奇,如果我能以某种方式获得作为InputSource的值开始?
对于这一点而言,性能很重要,如果我可以避免,那么无缘无故地来回转换似乎毫无意义。
答案 0 :(得分:4)
如果你的xml是一个参数,你就做不了多少。而且,正如JB Nizet和skaffman指出的那样,你不应该担心它。你只有一次在内存中,你只执行一次阅读。
但是如果xml是post body本身,那么你可以用:
来阅读它parser.parse(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));
答案 1 :(得分:1)
你在这里没有转换任何东西。只需使用阅读器从原始字符串中读取,然后使用适配器将阅读器视为InputSource。与IO相比,这些操作绝对没有任何成本。
答案 2 :(得分:1)
实际上,使用HTTP发布文件的推荐方法是使用multipart/form-data
(请查看此RFC-1867)。
使用它,您甚至可以发布多个文件,指定它们的mime类型及其编码 - 大多数答案都使用UTF-8 ......但是假设new StringReader(xmlString)
几乎相同,这是非常危险的但有点错误,因为没有givin'任何编码都会将jvm回退留在'服务器'默认编码上。
为了处理这样的文件上传而没有框架的开销(例如Struts2 ......如果你愿意)是使用FileUpload apache lib。
他们建议使用经典API(rfc),但它们提供了另一个智能功能,可以直接使用stream
...
现在谈论解析,我的POV是使用连接中的阅读器和上传文件的mime-type(由FileUpload给出)。因此,通过FileUpload,您可以访问FileItem
item.getContentType()
,InputStreamReader
可以使用此constructor
如果你想使用w / framework,甚至比Struts更进一步。这是我推荐阅读的内容,这是关于如何使用 Spring 3 updload progly和upload w/ Html
答案 3 :(得分:0)
您如何发送XML?是否可以将xml作为HTTP数据而不是HTTP参数发送?然后你应该能够将HttpInputStream重定向到一个InputSource,而不是从String中传递它。
但我认为从字符串读取会很快安静。只有当xmldata非常大时,才会出现性能问题,因为需要完全读取数据才能构造String。