2017-05-25 49 views
-1

考虑我刚才在正确的元素被发现,并放入我的地图,作品与当下的代码片段:导入和解析XML文件,而无需FileOutputStream中

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并从临时文件解析。无论如何,我可以做到这一点?

我已经到位OutputStreamWriter使用一个ByteArrayOutputStream,并调用toString()的ByteArrayOutputStream这样尝试:

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

但后来我的地图最终被空。

+0

罗恩,你能说出为什么你首先做这个身份转换吗?换句话说,如果您只是使用“Document doc = db.parse(emailAttach);'来收集您的'hWL',会出现什么问题?我希望高级Java XML API能够在没有这种额外转换的情况下将您与低级编码细节隔离开来。 – SergGr

+0

我宁愿这样做,但这是一个改造项目,旧的源代码有一个部分,首先将电子邮件附件转换为UTF-8。我不能告诉你为什么这是必要的,因为我甚至没有测试数据,所以对我来说离开这个处理会更安全。我想XML电子邮件附件有可能会有非英文字符。不幸的是,旧的逻辑包括在读入之前将附件的UTF-8转换版本保存到文件系统中以再次解析,但这是我相信我可以尝试消除的中间步骤。 – ron

回答

0

从API文档(其细致的研究的能力是任何一个程序员的宝贵财富) - 解析方法与字符串参数似乎采取不同的东西从你给它什么:

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

这可能是您的朋友:

db.parse(新ByteArrayInputStream的(bos.toByteArray()));

0

@ user2496748对不起,我应该搜索的API,而是我通过反编译器,它告诉我的参数看源代码更新是为arg0的,而不是URI。巨大差距。

我想我现在理解流读取器/作者和字节字符或反之亦然。

经过一番审查后,我能够简单地通过我的代码来实现我想做的事情。由于我能够将电子邮件附件作为输入源:

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

    emailAttach.setEncoding("UTF-8"); 

    Document doc = db.parse(emailAttach); 

也适用于并使用非英文字符进行测试。

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"));后继续。