simpleXml错误org.xmlpull.v1.XmlPullParserException:意外的标记(位置:TEXT @ 1:2

时间:2014-04-09 12:09:14

标签: java android xml spring

当我尝试使用rest Template和SimpleXmlHttpMessageConverter检索xml时出现此错误,我不知道为什么

04-09 12:02:00.920:W / System.err(16431):org.springframework.http.converter.HttpMessageNotReadableException:无法读取[class com.intescia.library.donnee.dto.wsresponse.MenuDto] ;嵌套异常是org.xmlpull.v1.XmlPullParserException:意外的标记(位置:java.io.InputStreamReader@21244c40中的TEXT @ 1:2)

这是我的代码:

private  RestTemplate getRestTemplateInstance() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    restTemplate.getMessageConverters().add(new SimpleXmlHttpMessageConverter());
    return restTemplate;
}


private HttpHeaders getHeader(Context context) {
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setAccept(Collections.singletonList(MediaType.ALL));
    requestHeaders.setAcceptEncoding(ContentCodingType.ALL);
    return requestHeaders;
}





@Override
 public MenuDto RecupererMenu(Context context,String url) {

    HttpHeaders requestHeaders = getHeader(context);
    RestTemplate restTemplate = getRestTemplateInstance();
    try {

        ResponseEntity<MenuDto> responses = restTemplate.exchange(url, HttpMethod.GET,  new HttpEntity<String>(requestHeaders),MenuDto.class);
        if(statusIsNotModified(responses.getStatusCode()))
            return null;
        MenuDto menu= responses.getBody();
    return menu;
} catch (Exception e) {
    e.printStackTrace();
    Log.i(TAG+" message="+e.getMessage(), "PROBLEM CONNEXION OU MAUVAISE URL? ERROR PAS DE REPONSE A PARTIR DE L URL= "+url);
    return null;
}

}

当我尝试使用String时,它可以正常工作

 public MenuDto RecupererMenu(Context context,String url) {

    HttpHeaders requestHeaders = getHeader(context);
    RestTemplate restTemplate = getRestTemplateInstance();
    String responseString="";
    try {
        ResponseEntity<String> responses = restTemplate.exchange(url, HttpMethod.GET,  new HttpEntity<String>(requestHeaders),String.class);
        responseString= responses.getBody();
        Serializer serializer = new Persister();
        MenuDto menu = serializer.read(MenuDto.class, responseString);
    return menu;
} catch (Exception e) {
    e.printStackTrace();
    Log.i(TAG+" message="+e.getMessage(), "PROBLEM CONNEXION OU MAUVAISE URL? ERROR PAS DE REPONSE A PARTIR DE L URL= "+url);
    return null;
}

}

文件xml是这样的:

<menu>
<menu_item gabarit="a_la_une">
<label>A la Une</label>
<url>
http://coiffuredeparis-recette.intescia.com/applis/a_la_une.aspx
</url>
</menu_item>
<menu_item gabarit="groupe">
<label>Profession coiffeur</label>
<menu>
<menu_item gabarit="rubrique">
<label>Marché</label>
<id>25</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/marche
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Organisation et management</label>
<id>30</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Organisation-et-management
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Stratégies d'entreprise</label>
<id>31</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Strategies-dentreprise
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Equipement et design</label>
<id>32</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Equipement-et-design
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Bien être</label>
<id>33</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Bien-etre
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Ecoles</label>
<id>572</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Ecoles/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Style et Savoir faire</label>
<menu>
<menu_item gabarit="rubrique">
<label>L'invité du mois</label>
<id>44</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Linvite-du-mois/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Tendances</label>
<id>41</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Tendances/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Savoir-faire</label>
<id>42</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Savoir-faire/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Le point sur...</label>
<id>43</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Le-point-sur/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Fiches techniques</label>
<id>29</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Fiches-techniques/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Formations artistiques</label>
<id>45</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Formations-artistiques/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>La rédac a repéré</label>
<menu>
<menu_item gabarit="rubrique">
<label>Salons insolites</label>
<id>46</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Salons-insolites/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Shopping produits</label>
<id>47</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Shopping-produits/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Banc d'essai</label>
<id>48</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Banc-dessai/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Accessoires</label>
<id>49</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Accessoires/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Culture Coiffure</label>
<menu>
<menu_item gabarit="rubrique">
<label>Les irrésistibles</label>
<id>50</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Les-irresistibles/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Le saviez-vous ?</label>
<id>51</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Le-saviez-vous/
</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Couturiers du cheveu</label>
<id>52</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Couturiers-du-cheveu/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Evènements</label>
<menu>
<menu_item gabarit="rubrique">
<label>Vidéos</label>
<url>
http://www.coiffuredeparis.fr/applis/rubrique_videos.xml
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>Services</label>
<menu>
<menu_item gabarit="rubrique" ref="agenda">
>
<label>Agenda</label>
<id>229</id>
<url>
http://coiffuredeparis-recette.intescia.com/applis/Agenda/
</url>
</menu_item>
<menu_item gabarit="emplois">
<label>Offres d'emploi</label>
<url>http://www.coiffuredeparis.fr/applis/emploi.aspx</url>
</menu_item>
<menu_item gabarit="rubrique">
<label>Fond de Commerce et Vente de matériel</label>
<url>
http://www.coiffuredeparis.fr/applis/fond_de_commerce.aspx
</url>
</menu_item>
<menu_item gabarit="webview">
<label>Prochain Business Trophy</label>
<url>
http://www.coiffuredeparis.fr/Evenements/Business-Trophy/2014/2/Business-Trophy-2014/
</url>
</menu_item>
<menu_item gabarit="webview">
<label>Dernier Business Trophy</label>
<url>
http://www.coiffuredeparis.fr/Evenements/Business-Trophy/2014/3/Retour-sur-les-laureats-2013-2019615W/
</url>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="groupe">
<label>MON COMPTE</label>
<menu>
<menu_item gabarit="compte">
<label>Se déconnecter</label>
</menu_item>
<menu_item gabarit="abonnement">
<label>Mon abonnement</label>
</menu_item>
<menu_item gabarit="favoris">
<label>Mes Favoris</label>
</menu_item>
</menu>
</menu_item>
<menu_item gabarit="parametres">
<label>Paramètres</label>
</menu_item>
<menu_item gabarit="avis">
<label>Donner un avis sur l'application</label>
</menu_item>
<menu_item gabarit="autopromo">
<label>Autopromo</label>
</menu_item>
</menu>

类MenuDto.java是:

     @Root(name="menu",strict=false)
public class MenuDto {

    public List<MenuItemDto> getListMenuItem() {
        return listMenuItem;
    }

    public void setListMenuItem(List<MenuItemDto> listMenuItem) {
        this.listMenuItem = listMenuItem;
    }

    public MenuDto(){
        super();
    }

    @ElementList(entry="menu_item",inline=true)
    private List <MenuItemDto> listMenuItem ;

}

MenuItemDto.java:

             @Root(name="menu_item",strict=false)

公共类MenuItemDto {

public String getGabarit() {
    return gabarit;
}
public void setGabarit(String gabarit) {
    this.gabarit = gabarit;
}
public String getLabel() {
    return label;
}
public void setLabel(String label) {
    this.label = label;
}
public String getUrl() {
    return url;
}
public void setUrl(String url) {
    this.url = url;
}
public MenuDto getMenu() {
    return menu;
}
public void setMenu(MenuDto menu) {
    this.menu = menu;
}
public MenuItemDto(){
    super();
}

@Attribute
private String gabarit;

@Element
private String label;

@Element(required=false)
private String url;

@Element(required=false)
private String smartAdPageId;

public String getSmartAdPageId() {
    return smartAdPageId;
}
public void setSmartAdPageId(String smartAdPageId) {
    this.smartAdPageId = smartAdPageId;
}

public MenuItemDto(String label) {
    super();
    this.label = label;
}

@Element(name="id",required=false)
private String Rubriqueid;

@Element(required=false)
private MenuDto menu;
public String getRubriqueid() {
    return Rubriqueid;
}
public void setRubriqueid(String rubriqueid) {
    Rubriqueid = rubriqueid;
}

}

感谢您的回复

1 个答案:

答案 0 :(得分:0)

有同样的问题:

解决了这个问题:

请参阅此链接:Reading UTF-8 - BOM marker

//InputStreamReader isr = new InputStreamReader(body.in(), charset); InputStreamReader isr = new InputStreamReader(new BOMInputStream(body.in(), false, ByteOrderMark.UTF_8));

SimpleXmlConverter类中的Overriden(Retrofit和SimpleXMLConverter)