Java 元素名已在简单框架中使用
我正在使用简单框架将xml解析为对象。 问题是xml中的元素名称相同,但路径不同 XML: 但是在反序列化过程中,它给了我一个例外:Java 元素名已在简单框架中使用,java,android,xml,xml-deserialization,simple-framework,Java,Android,Xml,Xml Deserialization,Simple Framework,我正在使用简单框架将xml解析为对象。 问题是xml中的元素名称相同,但路径不同 XML: 但是在反序列化过程中,它给了我一个例外: org.simpleframework.xml.core.PersistenceException: Element 'language' is already used with @org.simpleframework.xml.Element(data=false, name=language, required=true, type=void) on
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>
下面是一个如何映射类的示例: (示例-)类:
@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 + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
(我没有完整的实现,但我希望我的示例与之类似)
输入Xml:
@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 + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
输出:
@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 + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
(空白是由xml引起的)
看起来您想要序列化/反序列化一个列表,因此products
应该是一个列表(可以内联),而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;
// ...
/* For testing only */
@Override
public String toString()
{
return "Product{" + "name=" + name + ", description=" + description + ", desc=" + desc + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
注意:我使用该内部类作为帮助器,为image元素获取适当的xml结构
现在,接下来有一个类围绕着产品
。hoewever,我把它作为一个映射来实现,如果只有一个产品,你可以使用一个简单的类来代替列表
Prestashop
class:
@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 + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
输入Xml:
@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 + '}';
}
}
<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>
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 }
@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;
}
}
}
@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);
}
}
Serializer ser = new Persister();
Prestashop shop = ser.read(Prestashop.class, f);
System.out.println(shop.first());
<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}
您提供的XML与注释完全不匹配,请提供完整的XML和类定义以获得合理的答案。现在可能更好?谢谢您的答案,但它不起作用。。。它不断地给出相同的错误。只有在正确构建xml结构的情况下,才会在阅读中给出错误(请参阅Edited post)。我找不到办法让它工作,有办法吗?我明白了;请看我的第二次编辑,并告诉我你的结果:-)@ollo想看看这个吗?