考虑我目前正在使用的代码片段,找到正确的元素并将其放入我的地图中:
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");
然后我的地图最终变空了。
答案 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"));
开始继续。