HIERARCHY_REQUEST_ERR tout en essayant d'ajouter des éléments de fichier xml dans une boucle for
Comme le suggère le titre, je suis en train d'ajouter des éléments d'un document xml à l'aide d'une boucle for.
J'ai un ArrayList
de cordes appelé names
que je souhaite parcourir, et pour chaque nom créer un <user>
élément avec l'attribut name
et avec un enfant <record>
qui a les attributs id
, time
, date
, et project
.
Malheureusement, si vous faites défiler vers le bas dans le code ci-dessous pour les createDoc()
méthode, quand j'essaie d'appeler doc.appendChild(user)
, j'obtiens l'erreur suivante:
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)
J'ai regardé quelques questions sur stackoverflow qui ont la même erreur, mais ils semblent tous avoir eu lieu sous des circonstances complètement différentes à l'égard de la mine. Ma meilleure supposition est que cette erreur a à voir avec le fait que je suis en train de créer trop d'éléments parents au même niveau hiérarchique, mais je ne suis pas sûr et je n'ai presque pas d'expérience avec xml à tous.
Voici le 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);
}
}
J'ai écrit ce code comme une sorte de preuve de concept, car je vais finir par avoir à en effectuer une opération similaire, où je vais avoir une liste d'objets, chacun de qui je dois ajouter un fichier xml par la séparation de l'objet en ses parties constituantes avec get
méthodes.
Quelqu'un peut-il m'aider à résoudre cette erreur?
Vous devez vous connecter pour publier un commentaire.
J'ai découvert la réponse à ce problème. Voici comment:
J'ai créé un autre niveau hiérarchique appelé
<userList>
Chaque fois que la boucle for itérée, j'ai fait le nouvellement créé<user>
un enfant de<userList>
.Enfin, au-delà de la portée de la boucle for, j'ai fait le
<userList>
un enfant du document xml comme un tout.Le nouveau code est ici pour ceux que cela intéresse. Vous pouvez lire les commentaires dans le
createDoc()
méthode pour aider à clarifier ce que j'ai expliqué ci-dessus: