HIERARCHY_REQUEST_ERR при попытке добавить элементы в XML-файл в цикле for
Как видно из заголовка, я пытаюсь добавить элементы в документ XML с помощью цикла for. у меня естьArrayList
из названных строкnames
что я хочу перебрать, и для каждого имени создайте элемент с атрибутом
name
и с ребенком что имеет атрибуты,
id
time
date
, а также .project
К сожалению, если вы прокрутите вниз в коде ниже доcreateDoc()
метод, когда я пытаюсь позвонитьdoc.appendChild(user)
Я получаю следующую ошибку:
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.(XMLwriter.java:116)
at test.TestRunner.main(TestRunner.java:33)
Я рассмотрел несколько вопросов о стековом потоке, которые имеют ту же ошибку, но все они, кажется, возникли при совершенно разных обстоятельствах по отношению к моему. Мое предположение состоит в том, что эта ошибка связана с тем, что я пытаюсь создать слишком много родительских элементов на одном иерархическом уровне, но я не уверен, и у меня почти нет опыта работы с xml.
Вот код:}
public class XMLwriter {
private ArrayList names;
private Document doc;
private Random rand;
private ArrayList users;
public XMLwriter() throws ParserConfigurationException, TransformerException{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.newDocument();
rand = new Random();
users = new ArrayList();
names = new ArrayList();
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);
}
Я написал этот код как своего рода подтверждение концепции, потому что мне в конечном итоге придется фактически выполнить аналогичную операцию, где у меня будет список объектов, каждый из которых я должен добавить в XML-файл, разделив объект на составляющую. части сget
методы.
Может кто-нибудь помочь мне решить эту ошибку?