考虑我刚才在正确的元素被发现,并放入我的地图,作品与当下的代码片段:导入和解析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");
但后来我的地图最终被空。
罗恩,你能说出为什么你首先做这个身份转换吗?换句话说,如果您只是使用“Document doc = db.parse(emailAttach);'来收集您的'hWL',会出现什么问题?我希望高级Java XML API能够在没有这种额外转换的情况下将您与低级编码细节隔离开来。 – SergGr
我宁愿这样做,但这是一个改造项目,旧的源代码有一个部分,首先将电子邮件附件转换为UTF-8。我不能告诉你为什么这是必要的,因为我甚至没有测试数据,所以对我来说离开这个处理会更安全。我想XML电子邮件附件有可能会有非英文字符。不幸的是,旧的逻辑包括在读入之前将附件的UTF-8转换版本保存到文件系统中以再次解析,但这是我相信我可以尝试消除的中间步骤。 – ron