2013-03-04 75 views
3
package xml.dierenshop.flaming.v1; 

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.output.XMLOutputter; 
import org.jdom2.output.Format; 
import java.io.FileWriter; 
import java.io.IOException; 

public class Writer { 

    public void Writer(String categorie, String code, String naamartikel, String beschrijvingartikel, double prijz, String imgurl, String imgurl2, String imgurl3, String imgurl4, String imgurl5) { 
     String prijs = String.valueOf(prijz); 
     Document document = new Document(); 
     Element root = new Element("productlist"); 
     String naamelement = "naam"; 
     String categorieelement = "category"; 
     String descriptionelement = "description"; 
     Element child = new Element("product"); 
     child.addContent(new Element(categorieelement).setText(categorie)); 
     child.addContent(new Element("code").setText(code)); 
     child.addContent(new Element(naamelement).setText(naamartikel)); 
     child.addContent(new Element(descriptionelement).setText(beschrijvingartikel)); 
     child.addContent(new Element("price").setText(prijs)); 
     child.addContent(new Element("image").setText(imgurl)); 
     child.addContent(new Element("image").setText(imgurl2)); 
     child.addContent(new Element("image").setText(imgurl3)); 
     child.addContent(new Element("image").setText(imgurl4)); 
     child.addContent(new Element("image").setText(imgurl5)); 
     root.addContent(child); 
     document.setContent(root); 
     try { 
      FileWriter writer = new FileWriter("products.xml"); 
      XMLOutputter outputter = new XMLOutputter(); 
      outputter.setFormat(Format.getPrettyFormat()); 
      outputter.output(document, writer); 
      outputter.output(document, System.out); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

这是我用我的主类写变量的xml文件的类。 这里的输出是:使用jdom将内容添加到现有的xml

http://pastebin.com/nFtiv2b8

现在我有一个问题,下一次我运行这个Java应用程序,我希望它添加一个新的产品,但保留旧的。但是,每次我尝试这种方法时,都会用新数据替换旧数据。

+0

请在这里发布你的代码。 – bsiamionau 2013-03-04 19:23:40

+0

我真诚的道歉,我真的不明白如何做到这一点在stackoverflow。 – Boyen 2013-03-04 19:24:23

+0

当我这样做时,有一个名为“代码示例”的问题表单中的特殊按钮'(Ctrl + K)' – bsiamionau 2013-03-04 19:26:36

回答

6

基本上,您需要加载一个现有的xml文件,并通过解析它并从中获取根元素来制作Document。如果该文件不存在,则创建一个新文档和一个新的根元素。之后,您可以继续显示您的代码。

创建一个类Product来保存产品数据。将产品数据作为参数传递给方法是不行的。

产品类(为简单起见所有字段都是公开的,这不是一个好的做法,你应该让他们至少保护和每个getter和setter方法)

public class Product { 
    public String categorie; 
    public String code; 
    public String naamartikel; 
    public String beschrijvingartikel; 
    public double prijz; 
    public String imgurl; 
    public String imgurl2; 
    public String imgurl3; 
    public String imgurl4; 
    public String imgurl5; 
} 

作家方法

public static void Writer(Product product) throws JDOMException, IOException { 

    Document document = null; 
    Element root = null; 

    File xmlFile = new File("products.xml"); 
    if(xmlFile.exists()) { 
     // try to load document from xml file if it exist 
     // create a file input stream 
     FileInputStream fis = new FileInputStream(xmlFile); 
     // create a sax builder to parse the document 
     SAXBuilder sb = new SAXBuilder(); 
     // parse the xml content provided by the file input stream and create a Document object 
     document = sb.build(fis); 
     // get the root element of the document 
     root = document.getRootElement(); 
     fis.close(); 
    } else { 
     // if it does not exist create a new document and new root 
     document = new Document(); 
     root = new Element("productlist"); 
    } 


    String prijs = String.valueOf(product.prijz); 
    String naamelement = "naam"; 
    String categorieelement = "category"; 
    String descriptionelement = "description"; 
    Element child = new Element("product"); 
    child.addContent(new Element(categorieelement).setText(product.categorie)); 
    child.addContent(new Element("code").setText(product.code)); 
    child.addContent(new Element(naamelement).setText(product.naamartikel)); 
    child.addContent(new Element(descriptionelement).setText(product.beschrijvingartikel)); 
    child.addContent(new Element("price").setText(prijs)); 
    child.addContent(new Element("image").setText(product.imgurl)); 
    child.addContent(new Element("image").setText(product.imgurl2)); 
    child.addContent(new Element("image").setText(product.imgurl3)); 
    child.addContent(new Element("image").setText(product.imgurl4)); 
    child.addContent(new Element("image").setText(product.imgurl5)); 
    root.addContent(child); 
    document.setContent(root); 
    try { 
     FileWriter writer = new FileWriter("products.xml"); 
     XMLOutputter outputter = new XMLOutputter(); 
     outputter.setFormat(Format.getPrettyFormat()); 
     outputter.output(document, writer); 
     outputter.output(document, System.out); 
     writer.close(); // close writer 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

最后一个小测试

public static void main(String[] args) throws JDOMException, IOException { 
    Product product = null; 

    product = new Product(); 
    product.categorie = "cat1"; 
    product.code = "code1"; 
    product.naamartikel = "naam1"; 
    product.beschrijvingartikel = "beschrijving1"; 
    product.prijz = 100d; 
    product.imgurl = "http://localhost/img1.png"; 
    product.imgurl2 = "http://localhost/img2.png"; 
    product.imgurl3 = "http://localhost/img3.png"; 
    product.imgurl4 = "http://localhost/img5.png"; 
    product.imgurl5 = "http://localhost/img5.png"; 
    Writer(product); 

    product = new Product(); 
    product.categorie = "cat2"; 
    product.code = "code2"; 
    product.naamartikel = "naam2"; 
    product.beschrijvingartikel = "beschrijving2"; 
    product.prijz = 200d; 
    product.imgurl = "http://localhost/img21.png"; 
    product.imgurl2 = "http://localhost/img22.png"; 
    product.imgurl3 = "http://localhost/img23.png"; 
    product.imgurl4 = "http://localhost/img25.png"; 
    product.imgurl5 = "http://localhost/img25.png"; 
    Writer(product); 

    product = new Product(); 
    product.categorie = "cat3"; 
    product.code = "code3"; 
    product.naamartikel = "naam3"; 
    product.beschrijvingartikel = "beschrijving3"; 
    product.prijz = 300d; 
    product.imgurl = "http://localhost/img31.png"; 
    product.imgurl2 = "http://localhost/img32.png"; 
    product.imgurl3 = "http://localhost/img33.png"; 
    product.imgurl4 = "http://localhost/img35.png"; 
    product.imgurl5 = "http://localhost/img35.png"; 
    Writer(product); 
} 

此外,文件名不应该在java文件中硬编码;而是在运行该程序时将其作为参数传递。

+0

我在学校设法弄清了一些与我相似的东西,非常感谢! – Boyen 2013-03-05 17:23:30

+0

不客气! – A4L 2013-03-05 17:28:32

-3

在设置根作为文件使用的内容:

root = root.detach(); 

因为一个元素可以被关联到只有一个JDOM文档。

+0

谢谢你的技巧 – gxet4n 2015-05-20 21:54:21

1

通过

root = document.detachRootElement(); 

替换root=document.getRootElement();因为一个元素可以被关联到只有一个JDOM文档。

相关问题