Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java解组错误的à;_Java_Jaxb_Centos_Escaping_Unmarshalling - Fatal编程技术网

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=\"à&amp;#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=\"à&amp;#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=\"à&amp;#8364;\"/></Changes></Grid>";
InputSource is = new InputSource(new StringReader(xmlString));
Marshal obj = (Marshal) unmarshaller.unmarshal(is);