- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如标题所示,我正在尝试使用 for 循环将元素添加到 xml 文档中。我有一个ArrayList
名为 names
的字符串我希望迭代,并为每个名称创建一个 <user>
具有属性 name
的元素和一个 child <record>
具有属性 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.<init>(XMLwriter.java:116)
at test.TestRunner.main(TestRunner.java:33)
我在 stackoverflow 上查看了一些具有相同错误的问题,但它们似乎都是在与我完全不同的情况下发生的。我最好的猜测是,此错误与我试图在同一层次结构级别创建太多父元素有关。
这是代码:
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);
}
}
最佳答案
我找到了这个问题的答案。方法如下:
我创建了另一个名为 <userList>
的分层层每次迭代 for 循环时,我都会创建新创建的 <user>
<userList>
的 child 。
最后,超出了 for 循环的范围,我制作了 <userList>
整个 xml 文档的子级。
这是感兴趣的人的新代码。您可以阅读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);
}
}
关于java - 尝试在 for 循环中将元素添加到 xml 文件时出现 HIERARCHY_REQUEST_ERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864285/
如何添加与 child 相同的元素。我想要这样的东西:
以下代码在 Chrome 和 Firefox 中运行良好,但在 IE 9.0 中无法正常运行。 message.nodeTree.childNodes[1].childNodes[0].childNo
我正在尝试为 Google Chrome 开发一个应用程序:Packaged Apps 在我的 apolicação 中,使用命令 $.get 检索 HTML 页面并将其插入当前页面: 页面 HTML
正如标题所示,我正在尝试使用 for 循环将元素添加到 xml 文档中。我有一个ArrayList名为 names 的字符串我希望迭代,并为每个名称创建一个 具有属性 name 的元素和一个 chil
所以我正在重新设计我所做的一个旧项目。它在 Chrome 中运行良好,但在 IE 中运行得不太好。它基本上动态地创建选择,然后在最后一个选择中吐出所选的选择和有点幽默的响应。但在 IE 中,它吓坏了并
我正在尝试在窗口主体中创建一个弹出窗口,如下所示: this.jNotifObj = $('' + this.opts.message + ' ' + this.opts.actionTit
我正在使用带有 backbone 和 adobe air 的 javascript。在我的 View 模型中,我有一个解析函数,它保存响应(Dom 对象),稍后,当用户点击保存时,我想向保存的响应添加
完整的异常堆栈: Exception in thread "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was
我在这方面看得太久了,无法弄清楚我做错了什么。 因此,我正在尝试为某些内容生成 Xades 签名。不幸的是,我总是遇到同样的错误:“HIERARCHY_REQUEST_ERR”。这是我的 XML 文档
它与 jQuery 到底有什么关系?我知道该库在内部使用原生 javascript 函数,但每当出现此类问题时,它到底想做什么? 最佳答案 这意味着您尝试将 DOM 节点插入到 DOM 树中它无法进入
当我尝试在发送请求之前将安全 header 添加到 SOAP 信封时,出现以下异常。 在尝试检索消息时抛出异常(因此 context.getMessage() 抛出异常)。 当我使用 SoapUI 时
我在使用 Spring 配置(而不是 Spring-WS)公开为 Web 服务的无状态 bean 中使用 JAX-WS。我添加了一个 SOAP 处理程序,并且在处理程序中,当我尝试在 SOAPMess
我一直在使用本教程构建一个页面,我们可以在页面上重新排序和移动 div: http://net.tutsplus.com/tutorials/javascript-ajax/inettuts/ 我已经
编辑:发现问题 - 我正在将元素添加到文档中,而它本应添加到“rootElement”中。现在工作了。如果你们对如何改进我的代码有任何进一步的建议,请告诉我 在下面的代码中,我尝试手动在 XML 文件
我尝试转换(在 Eclipse 中)下面的文档: 使用 xslt:
我正在尝试创建一个简单的 XML 文档,但在将根元素添加到文档时收到上述错误。我只有一个根元素(为文档创建的第一个元素),并且在第一次append_child() 调用时抛出错误。以下是引发错误的代码
我是一名优秀的程序员,十分优秀!