java解组错误的à;
我尝试使用以下代码解组字符串:java解组错误的à;,java,jaxb,centos,escaping,unmarshalling,Java,Jaxb,Centos,Escaping,Unmarshalling,我尝试使用以下代码解组字符串: import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.Xm
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.io.IOUtils;
import org.xml.sax.InputSource;
@XmlRootElement(name="Grid")
public class Marshal {
@XmlAttribute(name="Reload", required = false)
public int reload;
@XmlElementWrapper(name="Changes")
@XmlElement(name="I")
public List<XmlAttributeHolder> rowList = new ArrayList<XmlAttributeHolder>();
public static void main(String[] args) {
try {
JAXBContext jc = JAXBContext.newInstance(Marshal.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
// à€
String xmlString = "<Grid><IO/><Changes><I id=\"0\" Changed=\"1\" STT=\"à&#8364;\"/></Changes></Grid>";
InputStream inputStream = IOUtils.toInputStream(xmlString);
InputSource is = new InputSource(inputStream);
is.setEncoding("ISO-8859-1");
Marshal obj = (Marshal) unmarshaller.unmarshal(is);
System.out.println(xmlString);
for (int i=0;i<obj.rowList.size();i++) {
XmlAttributeHolder xah = obj.rowList.get(i);
System.out.println(xah.getAttrMap());
for (String formValue:xah.getAttrMap().values()) {
System.out.println(StringEscapeUtils.unescapeXml(formValue));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static class XmlAttributeHolder {
@XmlAnyAttribute
public Map<QName, String> attrMap = new HashMap<QName, String>();
public void addAttribute(String name, String value) {
attrMap.put(QName.valueOf(name), value);
}
public String getAttribute(String name) {
return attrMap.get(QName.valueOf(name));
}
public Map<QName, String> getAttrMap() {
return attrMap;
}
}
}
当我尝试在IBM java 1.6 CentOS中运行此代码时,给出了错误的答案:
0
1
à €
如果您的输入实际上是一个
字符串
,我建议将其直接传递给解组器
,并封装在StringReader
中,而不是试图从中生成InputStream
。它不太容易出错
试试这个(请参阅下面的代码片段)。这样,您就不必担心您的代码是否指定了正确的编码,或者该编码的字符到字节转换是否正确
String xmlString = "<Grid><IO/><Changes><I id=\"0\" Changed=\"1\" STT=\"à&#8364;\"/></Changes></Grid>";
InputSource is = new InputSource(new StringReader(xmlString));
Marshal obj = (Marshal) unmarshaller.unmarshal(is);
String xmlString=”“;
InputSource is=新的InputSource(新的StringReader(xmlString));
Marshal obj=(Marshal)unmarshaller.unmarshal(is);
我怀疑您在创建InputStream时需要指定编码。此外,ISO-8859-1不能代表欧元符号,所以它可能只是愚蠢的运气,这是通过好的。谢谢!我有效地解决了删除InputStream和InputSource的问题。以这种方式,ISO转换和其他事情进行得非常顺利!
String xmlString = "<Grid><IO/><Changes><I id=\"0\" Changed=\"1\" STT=\"à&#8364;\"/></Changes></Grid>";
InputSource is = new InputSource(new StringReader(xmlString));
Marshal obj = (Marshal) unmarshaller.unmarshal(is);