java HIERARCHY_REQUEST_ERR 尝试在 for 循环中将元素添加到 xml 文件时
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17864285/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
HIERARCHY_REQUEST_ERR while trying to add elements to xml file in a for loop
提问by scottysseus
As the title suggests, I am trying to add elements to an xml doc using a for loop.
I have an ArrayList
of strings called names
that I wish to iterate through, and for each name create a <user>
element with attribute name
and with a child <record>
that has the attributes id
, time
, date
, and project
.
正如标题所暗示的,我正在尝试使用 for 循环将元素添加到 xml 文档。我有一个ArrayList
字符串叫names
,我想遍历,并为每个名称创建一个<user>
元素与属性name
,并与孩子<record>
具有的属性id
,time
,date
,和project
。
Unfortunately, if you scroll down in the code below to the createDoc()
method, when I try to call doc.appendChild(user)
, I get the following error:
不幸的是,如果您在下面的代码中向下滚动到该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.<init>(XMLwriter.java:116)
at test.TestRunner.main(TestRunner.java:33)
I have looked at a few questions on stackoverflow that have the same error, but they all seem to have occurred under completely different circumstances with respect to mine. My best guess is that this error has to do with the fact that I am trying to create too many parent elements at the same hierarchical level.
我查看了一些关于 stackoverflow 的问题,它们有相同的错误,但它们似乎都发生在与我的完全不同的情况下。我最好的猜测是这个错误与我试图在同一层次级别创建太多父元素的事实有关。
Here is the 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);
}
}
}
采纳答案by scottysseus
I discovered the answer to this problem. Here is how:
我发现了这个问题的答案。方法如下:
I created another hierarchical layer called <userList>
Each time the for loop iterated, I made the newly created <user>
a child of <userList>
.
我创建了另一个分层层,称为<userList>
每次 for 循环迭代时,我将新创建<user>
的<userList>
.
Finally, beyond the scope of the for loop, I made the <userList>
a child of the xml document as a whole.
最后,超出了 for 循环的范围,我<userList>
将 xml 文档的子元素作为一个整体。
Here is the new code for those interested. You can read the comments in the createDoc()
method to help clarify what I explained above:
这是感兴趣的人的新代码。你可以阅读createDoc()
方法中的注释来帮助澄清我上面解释的内容:
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(){
Element userList = doc.createElement("userList");//here, I create a new, over-arching element.
for(int k = 0; k < names.size(); k++)
{
users.add(doc.createElement("user"));
}
for (int x = 0; x < 2; x++){
//create the elements
Element record = doc.createElement("record");
users.get(x).appendChild(record);
userList.appendChild(users.get(x));//I make each of the <user> elements a child of the over-arching element
//The line that was 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);
}
doc.appendChild(userList);//note how I append this child outside of the for loop
}
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);
}
}