导入并解析没有FileOutputStream的xml文件

时间:2017-05-25 10:33:17

标签: java

考虑我目前正在使用的代码片段,找到正确的元素并将其放入我的地图中:

  public void importXml(InputSource emailAttach)throws Exception {
      Map<String, String> hWL = new HashMap<String, String>();

      DocumentBuilderFactory dbf =   DocumentBuilderFactory.newInstance();     
      DocumentBuilder db = dbf.newDocumentBuilder();

      Document doc = db.parse(emailAttach);

      FileOutputStream fos=new FileOutputStream("temp.xml");

      OutputStreamWriter os = new OutputStreamWriter(fos,"UTF-8");
      //  Transform to XML UTF-8 format
      TransformerFactory tf = TransformerFactory.newInstance();
      Transformer t = tf.newTransformer();  
      t.transform(new DOMSource(doc), new StreamResult(os));
      os.close();
      fos.close();

      doc = db.parse(new File("temp.xml"));

      NodeList nl = doc.getElementsByTagName("Email");
      Element eE=(Element)nl.item(0);
      int ctr=eE.getChildNodes().getLength();
      String sNName;
      String sNValue;
      Node nTemp;
      for (int i=0;i<ctr;i++){
         nTemp=eE.getChildNodes().item(i);
         sNName=nTemp.getNodeName().toUpperCase().trim();
         if (nTemp.getChildNodes().item(0)!=null) {
            sNValue=nTemp.getChildNodes().item(0).getNodeValue().trim();
            hWL.put(sNName,sNValue); 
         }
      }
 }

但是,在将数据转换为UTF-8并从临时文件解析后,我不想先创建临时文件。无论如何我能做到吗?

我尝试使用ByteArrayOutputStream代替OutputStreamWriter,并在ByteArrayOutputStream上调用toString():

doc = db.parse(bos.toString("UTF-8");

然后我的地图最终变空了。

3 个答案:

答案 0 :(得分:0)

从API文档(其精心学习的能力是任何程序员的宝贵资产) - 使用String参数的解析方法似乎采取了与您提供的内容不同的东西:

  

文档解析(String uri)   将给定URI的内容解析为XML文档,并返回一个新的DOM&gt; Document对象。

这可能是你的朋友:

  

db.parse(new ByteArrayInputStream(bos.toByteArray()));

答案 1 :(得分:0)

更新 @ user2496748对不起,我应该搜索API,但我通过反编译器查看源代码,它告诉我参数是arg0而不是uri。差异很大。

我认为我现在理解流读者/编写者和字节到字符,反之亦然。

经过一番审查后,我能够简单地将我的代码用于此并实现我想要做的事情。由于我能够将电子邮件附件作为InputSource获取:

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();     
  DocumentBuilder db = dbf.newDocumentBuilder();

  emailAttach.setEncoding("UTF-8");

  Document doc = db.parse(emailAttach);

也可以使用非英文字符进行测试。

答案 2 :(得分:0)

您不需要编写和重新读取和重新解析转换后的文档。只需改变一下:

t.transform(new DOMSource(doc), new StreamResult(os));

到此:

DOMResult result = new DOMResult();
t.transform(new DOMSource(doc), result);
doc = (Document)result.getNode();

然后从现在的doc = db.parse(new File("temp.xml"));开始继续。