2013-05-07 3 views
2

Я разбираю xml в объект, используя Simple Framework. Проблема в том, что xml имеет элементы с тем же именем, но с разными путями.Имя элемента уже используется простая структура

XML:

<prestashop> 
<products> 
    <product> 
    <name> 
     <language id="1"> name </language> 
    </name> 
    <description> 
     <language id="1"> description </language> 
    </description> 
    <description_short> 
     <language id="1"> desc </language> 
    </description_short> 
    </product> 
</products> 
</prestashop> 

мой класс отображается так:

@Root(name="prestashop") 
public class Product{ 
    @Element(name="language") 
    @Path("products/product/description_short[1]") 
    private String shortDesc; 

    @Element(name="language") 
    @Path("products/product/description[1]") 
    private String longDesc; 

    @Element(name="language") 
    @Path("products/product/name[1]") 
    private String name; 
} 

Но во время десериализации, это дает мне исключение:

org.simpleframework.xml.core.PersistenceException: 
Element 'language' is already used with @org.simpleframework.xml.Element(data=false, name=language, required=true, type=void) 
on field 'name' private java.lang.String model.Product.name at line 8 

Как я могу сопоставить теги с тем же именем, но по разным путям?

если я сериализовать объект продукта он дает мне правильную структуру XML:

<prestashop xmlns="http://www.w3.org/1999/xlink"> 
    <products> 
     <product> 
      <description_short> 
      <language>short</language> 
      </description_short> 
      <id_default_image href="path"/> 
      <description> 
      <language>long</language> 
      </description> 
      <name> 
      <language>aaa</language> 
      </name> 
      <price>10.0</price> 
      <id>1</id> 
     </product> 
    </products> 
</prestashop> 

Im десериализации как это:

product = new Product(); 
InputStream in = res.getResponse(); 
Serializer serializer = new Persister(); 
serializer.read(product, in,false); 
+1

XML, вы предоставили никоим образом не соответствует аннотациям, обеспечивает полный XML и определение класса для разумного ответа. –

+0

Может быть, теперь это лучше? –

ответ

3

Вот пример того, как карта класса:

(Пример-) Класс:

@Root(name = "product") 
public class Product 
{ 
    @Path(value = "name") 
    @Element(name = "language") 
    private String name; 

    @Path(value = "description") 
    @Element(name = "language") 
    private String description; 

    @Path(value = "description_short") 
    @Element(name = "language") 
    private String desc; 


    // ... 

    /* For testing only */ 
    @Override 
    public String toString() 
    { 
     return "Product{" + "name=" + name + ", description=" + description + ", desc=" + desc + '}'; 
    } 
} 

(я не имею полного осуществления, но я надеюсь, что мой пример похож)

Входной Xml:

<product> 
    <name> 
     <language id="1"> name </language> 
    </name> 
    <description> 
     <language id="1"> description </language> 
    </description> 
    <description_short> 
     <language id="1"> desc </language> 
    </description_short> 
</product> 

Обратите внимание на <product> </product> тег и " для id - (без них он может потерпеть неудачу)

T Est-код:

final File f = new File("test.xml"); // Input file 

Serializer ser = new Persister(); 
Product p = ser.read(Product.class, f); // deserialize the class 


System.out.println(p); // output - thats why i've implemented the 'toString()' method 

Выход:

Product{name= name , description= description , desc= desc } 

(Пробелы вызваны XML)

Похоже, что вы хотите сериализовать/десериализации список так products РЕКОМЕНДУЕМЫМ быть списком (может быть встроен), а product - класс сверху.



Edit:

Product класс:

@Root(name = "product") 
public class Product 
{ 
    @Path(value = "name") 
    @Element(name = "language") 
    private String name; 

    @Path(value = "description") 
    @Element(name = "language") 
    private String description; 

    @Path(value = "description_short") 
    @Element(name = "language") 
    private String desc; 

    @Element(name = "id_default_image") 
    private AttributedElement idDefaultImage; 

    @Element(name = "price") 
    private double price; 

    @Element(name = "id") 
    private int id; 



    @Override 
    public String toString() 
    { 
     return "Product{" + "name=" + name + ", description=" + description 
       + ", desc=" + desc + ", idDefaultImage=" + idDefaultImage 
       + ", price=" + price + ", id=" + id + '}'; 
    } 



    @Root(name = "AttributedElement") 
    static class AttributedElement 
    { 
     @Attribute(name = "href") 
     private String value; 


     public AttributedElement(String value) 
     { 
      this.value = value; 
     } 

     private AttributedElement() 
     { 
      /* Empty constructor required here */ 
     } 


     @Override 
     public String toString() 
     { 
      return value; 
     } 
    } 

} 

Примечание: Я использовал этот внутренний класс в качестве помощника, чтобы получить правильную структуру XML для элемента изображения.

Теперь, следующий класс, который обертывается вокруг Product. Я реализовал это как карту, но если есть только один продукт, вы можете использовать простой класс вместо списка.

Prestashop класс:

@Root(name = "prestashop") 
public class Prestashop 
{ 
    @ElementList(name = "products", empty = false, required = true) 
    private ArrayList<Product> products; 


    public Prestashop() 
    { 
     this.products = new ArrayList<>(); 
    } 


    /* Some list methods */ 

    public void add(Product p) 
    { 
     products.add(p); 
    } 

    public Product get(int index) 
    { 
     return products.get(index); 
    } 

    public Product first() 
    { 
     return products.get(0); 
    } 

} 

Примечание: Для объяснения, почему я не использую List<Product> здесь, пожалуйста, см this answer.

тест-код:

Serializer ser = new Persister(); 

Prestashop shop = ser.read(Prestashop.class, f); 
System.out.println(shop.first()); 

Входной Xml:

<prestashop xmlns="http://www.w3.org/1999/xlink"> 
    <products> 
     <product> 
      <description_short> 
      <language>short</language> 
      </description_short> 
      <id_default_image href="path"/> 
      <description> 
      <language>long</language> 
      </description> 
      <name> 
      <language>aaa</language> 
      </name> 
      <price>10.0</price> 
      <id>1</id> 
     </product> 
    </products> 
</prestashop> 

(второй один из Вашего вопроса)

И последнее ...

Выход:

Product{name=aaa, description=long, desc=short, idDefaultImage=path, price=10.0, id=1} 
+0

Спасибо за ответ, но он не работал ... он продолжает давать ту же ошибку. Ошибка указана только в чтении, если я пишу структуру xml правильно построена (см. Редактируемый пост). Я не могу найти способ заставить его работать, есть ли способ? –

+0

Я вижу; см. мой * edit * для второй попытки и скажите мне свой результат :-) – ollo

+0

Это фактически решает проблему =]. Спасибо! –

Смежные вопросы