Wie das Parsen von XML SimpleXML
Ich versuche zu analysieren, die unter XML
mit SimpleXML
analysieren.
Ich habe versucht, verschiedene Möglichkeiten zu analysieren, die Attributes
des Element
aber nicht in der Lage, um Erfolg in der Analyse das folgende XML.
Es wird ein Fehler generiert, der Liste unten.
<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>
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;
}
OrderObject.java
public class OrderObject
{
@ElementList(required=true, inline=true)
private List<Order> list = new ArrayList<Order>();
public List<Order>getList()
{
return this.list;
}
}
Ausnahme, die ich bekomme, ist :
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)
.
.
- +1 - wird eine hilfreiche Frage!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund für diese Ausnahme sind die beiden
@Attribute
Anmerkungen. Sie sind nicht festgelegt auf das nächste element, sondern die gesamteOrder
Objekt. Ihre Anmerkungen würdenhref
zweimal, aber mit unterschiedlichen Werten.Bitte siehe JavaDoc von
@Attribute
:Aber es ist eine schöne und einfache Lösung: Statt der Kombination von element und Attribut, stellen Sie eine Klasse, die dies tut.
OrderObject
Klasse:Hinweis: Die
toString()
Methoden in diese Klassen werden nur implementiert, um das Ergebnis überprüfen!Order
Klasse:Sehen Sie die
AdressDelivery
undAdressInvoice
Klassen die Kombination von Attribut und element. Sie nicht haben, um Sie zu implementieren als innere Klassen; fühlen Sie sich frei, zu schreiben, Sie als "normal" ein. Sie haben auch nicht zu machen, diese öffentliche, auch private möglich ist (zB. Sie bauen innerhalb derOrder
's Konstruktor.Beachten Sie aber bitte die leeren Konstruktoren ohne Argumente in
Order
Klasse (und innere Klassen). Sie sind erforderlich. Aber Sie können alle von Ihnenprivate
- keine Notwendigkeit, Sie aufzudecken. Es ist nur wichtig, dass Sie haben ein Konstruktor ohne Argumente.Wie zu verwenden (Beispiel):
Dieser code parst die Xml-Datei aus und druckt das Objekt deserialisiert.
Xml-Input - (wie in deiner Frage):
Ergebnis (aus
println()
):Nicht klar dargestellt, aber genug, um das Ergebnis zu sehen 🙂