HIERARCHY_REQUEST_ERR, während Sie versuchen, um Elemente in xml-Datei in einer for-Schleife

Wie der Titel schon sagt, bin ich versucht, hinzufügen von Elementen zu einem xml-Dokument mithilfe einer for-Schleife.
Ich habe eine ArrayList von strings genannt names möchte ich Durchlaufen, und für jeden Namen, erstellen Sie eine <user> - element mit dem Attribut name und mit einem Kind <record> das die Attribute id, time, date, und project.

Leider, wenn Sie nach unten scrollen in dem code unten, um die createDoc() Methode, wenn ich versuche zu nennen doc.appendChild(user), bekomme ich die folgende Fehlermeldung:

Exception in thread "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
at org.apache.xerces.dom.CoreDocumentImpl.insertBefore(Unknown Source)
at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source)
at test.XMLwriter.createDoc(XMLwriter.java:131)
at test.XMLwriter.<init>(XMLwriter.java:116)
at test.TestRunner.main(TestRunner.java:33)

Ich habe mir ein paar Fragen auf stackoverflow, die haben den gleichen Fehler, aber Sie alle zu haben scheinen, ist aufgetreten unter völlig anderen Umständen mit Respekt zu mir. Meine beste Vermutung ist, dass dieser Fehler hat mit der Tatsache zu tun, dass ich versucht bin, zu schaffen, zu viele übergeordnete Elemente auf der gleichen hierarchischen Ebene, aber ich bin mir nicht sicher und ich habe fast keine Erfahrung mit xml überhaupt.

Hier ist der code:

public class XMLwriter {
private ArrayList<String> names;
private Document doc;
private Random rand;
private ArrayList<Element> users;

public XMLwriter() throws ParserConfigurationException, TransformerException{

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    doc = docBuilder.newDocument();

    rand = new Random();
    users = new ArrayList<Element>();
    names = new ArrayList<String>();

    names.add("Ralph Wiggum");names.add("Mr. Hanky");names.add("Bulbasaur");
    names.add("Tyroil Smoochie Wallace");names.add("Scooby Doo");names.add("Neville Longbottom");
    names.add("Jabba the Hutt");names.add("Silky Johnson");names.add("Master Chief");
    names.add("Frodo Baggins");names.add("Clayton Bigsby");names.add("John Snow");
    names.add("Eric Cartman");names.add("Leoz Maxwell Jilliumz");names.add("Aslan");

    createDoc();
    generateFile();

}

public void createDoc(){
    for(int k = 0; k < names.size(); k++)
    {
        users.add(doc.createElement("user"));
    }
    for (int x = 0; x < names.size(); x++){

        //create the elements
        Element record = doc.createElement("record");
        users.get(x).appendChild(record);
        doc.appendChild(users.get(x));//The line that is throwing the error

        //create the attributes
        Attr name = doc.createAttribute("name");
        Attr date = doc.createAttribute("date");
        Attr project = doc.createAttribute("project");
        Attr time = doc.createAttribute("time");
        Attr id = doc.createAttribute("id");

        //give all of the attributes values
        name.setValue(names.get(x));
        date.setValue(new Date().toString());
        project.setValue("Project" + (rand.nextDouble() * 1000));
        time.setValue("" + rand.nextInt(10));
        id.setValue("" + (rand.nextDouble() * 10000));

        //assign the attributes to the elements
        users.get(x).setAttributeNode(name);
        record.setAttributeNode(date);
        record.setAttributeNode(project);
        record.setAttributeNode(time);
        record.setAttributeNode(id);


    }
}

public void generateFile() throws TransformerException{
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File("C:\\Users\\sweidenkopf\\workspace\\test\\testxml.xml"));

    //Output to console for testing
    //StreamResult result = new StreamResult(System.out);
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
    transformer.transform(source, result);
}

}

Schrieb ich diesen code als eine Art proof-of-concept, weil ich irgendwann eigentlich führen Sie einen ähnlichen Betrieb, wo ich eine Liste von Objekten, von denen jedes ich muss hinzufügen einer xml-Datei durch die Trennung des Objekts in seine Bestandteile mit get Methoden.

Kann mir jemand helfen diesen Fehler beheben?

InformationsquelleAutor scottyseus | 2013-07-25
Schreibe einen Kommentar