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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entdeckte ich die Antwort auf dieses problem. Hier ist, wie:
Erstellte ich eine weitere hierarchische Ebene namens
<userList>
Jedes mal, wenn die for-Schleife iteriert, machte ich die neu erstellte<user>
ein Kind<userList>
.Schließlich, die über den Umfang der for-Schleife, die ich aus dem
<userList>
Kind ein xml-Dokument als ganzes.Hier ist der neue code für die interessiert. Lesen Sie die Kommentare in der
createDoc()
Methode zu helfen, zu klären, was ich oben erklärt: