gpt4 book ai didi

java - 元素名称已使用简单框架

转载 作者:搜寻专家 更新时间:2023-11-01 08:59:23 24 4
gpt4 key购买 nike

我正在使用 Simple Framework 将 xml 解析为对象。问题是 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>

我的类(class)是这样映射的:

@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;
}

但是在反序列化过程中,它给了我一个异常(exception):

  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>

我这样反序列化:

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

最佳答案

这是一个如何映射类的例子:

(示例-)类:

@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 -属性(没有它们可能会失败)

测试代码:

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是上面的类。



编辑:

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 的类.我将其实现为 map ,但是,如果只有一种产品,您可以使用简单的类代替列表。

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}

关于java - 元素名称已使用简单框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com