Har*_*ary 9 xml android xml-serialization xml-parsing simple-framework
我试图XML使用SimpleXML解析来解析下面的内容.
我曾在不同的方法试图解析Attributes的Element,但无法在解析XML下方获得成功.
它会生成一个列表底部的错误.
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<order>
<id>1</id>
<id_address_delivery xlink:href="http://abc.com/add/1">1</id_address_delivery>
<id_address_invoice xlink:href="http://abc.com/add/2">2</id_address_invoice>
</order>
</prestashop>
Run Code Online (Sandbox Code Playgroud)
Order.java
@Root(name="order")
@Namespace(reference="http://www.w3.org/1999/xlink",prefix="xlink")
public class Order {
@Element(name="id",required=true)
private int order_id;
@Element(name="id_address_delivery",required=false)
private int id_address_delivery;
@Attribute( name="href", required=false)
private String id_address_delivery_href;
@Element(name="id_address_invoice",required=false)
private int id_address_invoice;
@Attribute(name="href", required=false)
private String id_address_invoice_href;
}
Run Code Online (Sandbox Code Playgroud)
OrderObject.java
public class OrderObject
{
@ElementList(required=true, inline=true)
private List<Order> list = new ArrayList<Order>();
public List<Order>getList()
{
return this.list;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
WARN/System.err(988): org.simpleframework.xml.core.PersistenceException:
Duplicate annotation of name 'href' on field 'id_address_delivery_href'
private java.lang.String com.prestashop.orders.Order.id_address_delivery_href
at org.simpleframework.xml.core.StructureBuilder.process(StructureBuilder.java:250)
at org.simpleframework.xml.core.StructureBuilder.process(StructureBuilder.java:173)
at org.simpleframework.xml.core.ObjectScanner.field(ObjectScanner.java:438)
at org.simpleframework.xml.core.ObjectScanner.scan(ObjectScanner.java:371)
at org.simpleframework.xml.core.ObjectScanner.<init>(ObjectScanner.java:82)
.
.
Run Code Online (Sandbox Code Playgroud)
这个例外的原因是你的两个@Attribute注释.它们不是设置为下一个元素,而是设置为整个Order对象.您的注释会设置href两次,但值不同.
请参阅JavaDoc @Attribute:
的
Attribute注释表示一个XML元素中的序列化的XML属性.[...]
但是有一个很好而且简单的解决方案:不是组合元素和属性,而是创建一个执行此操作的类.
OrderObject 类:@Root(name = "prestashop")
@Namespace(reference = "http://www.w3.org/1999/xlink", prefix = "xlink")
public class OrderObject
{
@ElementList(required = true, inline = true)
private List<Order> list;
public OrderObject()
{
this.list = new ArrayList<>();
}
public List<Order> getList()
{
return list;
}
// ...
@Override
public String toString()
{
return "OrderObject{" + "list=" + list + '}';
}
}
Run Code Online (Sandbox Code Playgroud)
注意:toString()这些类中的方法仅用于检查结果!
Order 类:@Root(name = "order")
public class Order
{
@Element(name = "id")
private int id;
@Element(name = "id_address_delivery")
private AdressDelivery delivery;
@Element(name = "id_address_invoice")
private AdressInvoice invoice;
public Order(int id, AdressDelivery delivery, AdressInvoice invoice)
{
this.id = id;
this.delivery = delivery;
this.invoice = invoice;
}
private Order() { }
// Getter / Setter etc.
@Override
public String toString()
{
return "Order{" + "id=" + id + ", delivery=" + delivery + ", invoice=" + invoice + '}';
}
@Root()
public static class AdressDelivery
{
@Namespace(reference = "http://www.w3.org/1999/xlink", prefix = "xlink")
@Attribute(name = "href", required = false)
private String link;
@Text()
private int value;
public AdressDelivery(String link, int value)
{
this.link = link;
this.value = value;
}
AdressDelivery() { }
// Getter / Setter etc.
@Override
public String toString()
{
return "AdressDelivery{" + "link=" + link + ", value=" + value + '}';
}
}
@Root()
public static class AdressInvoice
{
@Attribute(name = "href", required = false)
@Namespace(reference = "http://www.w3.org/1999/xlink", prefix = "xlink")
private String link;
@Text()
private int value;
public AdressInvoice(String link, int value)
{
this.link = link;
this.value = value;
}
AdressInvoice() { }
// Getter / Setter etc.
@Override
public String toString()
{
return "AdressInvoice{" + "link=" + link + ", value=" + value + '}';
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到组合属性和元素的AdressDelivery和AdressInvoice类.您不必将它们实现为内部类; 随意把它们写成"正常"的.你也不必将它们公开,即使是私有也是可能的(例如,在构造函数中构造它们)Order.
但是请注意Order类中没有参数的空构造函数(以及它的内部类).它们是必需的.但是你可以制作所有这些private- 不需要暴露它们.拥有一个没有参数的构造函数是非常重要的.
File f = new File("whatever.xml");
Serializer ser = new Persister();
OrderObject orderObject = ser.read(OrderObject.class, f);
System.out.println(orderObject);
Run Code Online (Sandbox Code Playgroud)
此代码从文件解析Xml并打印反序列化的对象.
输入Xml (如你的问题所示):
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<order>
<id>1</id>
<id_address_delivery xlink:href="http://abc.com/add/1">1</id_address_delivery>
<id_address_invoice xlink:href="http://abc.com/add/2">2</id_address_invoice>
</order>
</prestashop>
Run Code Online (Sandbox Code Playgroud)
结果(来自println()):
OrderObject{list=[Order{id=1, delivery=AdressDelivery{link=http://abc.com/add/1, value=1}, invoice=AdressInvoice{link=http://abc.com/add/2, value=2}}]}
Run Code Online (Sandbox Code Playgroud)
没有明确表示,但足以看到结果:-)
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |