2009-07-02 12 views
2

Ich muss eine XML-Datei mit Java schreiben.Der Inhalt sollte von einer Karte geschrieben werden.Die Karte enthält Elemente als Schlüssel und ihren Marktanteil als Wert.Ich muss eine XML-Datei mit zwei Tags erstellen.I Verwenden Sie diese XML, um ein Kreisdiagramm mit Amcharts zu erstellen. Kann jemand mit einem vorhandenen Code helfen?XML mit Java

<xml> 
<pie> 
    <slice title="<Map key1>"><Map Value1></slice> 
    <slice title="<Map key2>"><Map Value2></slice> 
    <slice title="<Map key1>"><Map Value3></slice> 
    . 
    . 
    . 
    <slice title="<Map keyn>"><Map Valuen></slice> 
</pie> 

Antwort

2

Es gibt eine Reihe von Möglichkeiten, dies mit der Standard-API zu tun. (Legen Sie Ihre eigenen Einsprüche über Ausführlichkeit und die Fabrik-Muster.)

Sie die XMLStreamWriter verwenden können, um die Daten zu kodieren:

XMLOutputFactory factory = XMLOutputFactory 
    .newInstance(); 
XMLStreamWriter writer = factory.createXMLStreamWriter(
    stream, "UTF-8"); 
try { 
    writer.writeStartDocument("UTF-8", "1.0"); 
    writer.writeStartElement("pie"); 
    for (Entry<String, String> entry : map.entrySet()) { 
    writer.writeStartElement("slice"); 
    writer.writeAttribute("title", entry.getKey()); 
    writer.writeCharacters(entry.getValue()); 
    writer.writeEndElement(); 
    } 
    writer.writeEndElement(); 
    writer.writeEndDocument(); 
} finally { 
    writer.close(); 
} 

Alternativ könnten Sie ein DOM document (nicht empfohlen) bauen und emittieren das, oder Verwenden Sie JAXB Bindung an Marshal/Unmarshal Daten (tutorial).

Probe kommentierte JAXB Objekt:

@XmlRootElement(name = "pie") 
public class Pie { 

    @XmlElement(name = "slice") 
    public List<Slice> slices = new ArrayList<Slice>(); 

    public Pie() { 
    } 

    public Pie(Map<String, String> sliceMap) { 
    for (Map.Entry<String, String> entry : sliceMap 
     .entrySet()) { 
     Slice slice = new Slice(); 
     slice.title = entry.getKey(); 
     slice.value = entry.getValue(); 
     slices.add(slice); 
    } 
    } 

    static class Slice { 
    @XmlAttribute 
    public String title; 
    @XmlValue 
    public String value; 
    } 

} 

Prüfregeln:

Map<String, String> slices = new HashMap<String, String>(); 
slices.put("Title 1", "100"); 
slices.put("Title 2", "200"); 

Pie pie = new Pie(slices); 
JAXB.marshal(pie, System.out); 

eine Vielzahl von Drittanbieter-APIs Es gibt die bereits erwähnt wurden die gleichen Arbeitsplätze und verschiedene Templating Optionen tun.

+0

Fantastic ... Marvellous..voted für Sie – Harish

1

zu cadrian Antwort hinzufügen: Sie können auch eine Template-Engine wie FreeMarker nutzen könnten. Dadurch können Sie XML als Vorlage außerhalb Ihres Java-Codes verwenden und die Bindung zwischen Ihren Java-Objekten und XML innerhalb der Vorlage herstellen.

+0

ja, du hast natürlich Recht. Oder Geschwindigkeit. – cadrian

2

Ich würde aufpassen, XML direkt zu schreiben, da Sie sich Sorgen um Entitätscodierung machen müssen.

z.B. Schreiben von Textinhalt mit <, > oder & direkt generiert ungültiges XML. Das gleiche gilt für Velocity und Freemarker.

Wenn Sie den XML-Code direkt schreiben, vergewissern Sie sich, dass der gesamte Textinhalt korrekt codiert ist. Sie können dies mit Apache Commons und tun.

EDIT: Blick auf Ihre XML-Anforderungen, XStream kann für Sie arbeiten. Wenn Sie eine java.util.Map haben, kann XStream dies direkt schreiben. Sie müssen aliasing betrachten, um Ihre Elementnamen zu ändern, aber möglicherweise einen Blick wert.