当前位置: 首页 > 面试题库 >

尝试在for循环中将元素添加到xml文件时出现HIERARCHY_REQUEST_ERR

丌官寒
2023-03-14
问题内容

如标题所示,我正在尝试使用for循环将元素添加到xml文档中。我有一个ArrayList字符串叫names,我想遍历,并为每个名称创建一个<user>元素与属性name,并与孩子<record>具有的属性idtimedate,和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);
}

}


问题答案:

我发现了这个问题的答案。html" target="_blank">方法如下:

我创建了另一个层次结构层,<userList>每次迭代for循环时,我都会使新创建<user>的子层为<userList>

最后,超出了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);
}

}


 类似资料:
  • 问题内容: 我正在尝试使用JAXB将以下XML映射到POJO,以便可以使用XML中的数据,但是,出现以下错误: XML: 我的POJO(故意将getter / setter从问题中跳过) ItemSearchResponse 物品 项目 项目属性 问题 我该如何解决错误?我的POJO设置不正确吗?如果是这样,我应该如何重组POJO? xml中有多个。如何将它们映射到数组或排序列表。 问题答案: 您

  • 问题内容: 我在Google上搜索的次数越多,我就会越来越困惑。 我从CSV导入了一个长度未知的名称列表以及其他一些详细信息,然后我需要将其转换为Person对象并将其存储在名为people的列表中,该列表是该类Club的实例变量,它的列表成员基本上。 这是非常复杂的事情的非常简化的版本,我需要在while中循环遍历文件,为每行创建对象,然后将其添加到列表集合中。 但是,当我运行代码时,我一直收到

  • 我在循环节点时遇到了麻烦。我有一些工作示例,但是XML布局略有不同。 XML 我可以得到一个家庭的列表,但我需要得到每个家庭下的标签(如“喜欢在外面玩”)之间的随机信息列表。到目前为止,我只能得到一份姓氏的名单。 XSLT 只是不知道为什么这不起作用。

  • 我正在尝试在单个链表的末尾插入一个新节点。但是我在编译后不断得到空点例外。 下面是节点类。 这里是单个LL类 addFirst()方法有效。当我试图通过addLast()创建一个LL时,出现了NullPointerException。我想< code > if(size = = 0){ head = new node;一定有什么问题;},但是我想不通。

  • 我发现这个问题很有帮助,但是我仍然很难让我的循环正确工作。 期望: 我正在构建一个简单的JavaFX应用程序,它的用户界面通过几个文本字段和几个按钮进行输入。我已经建立了一个“重置”按钮,应该清除所有文本字段中的文本,但是我不能让它工作。 按钮的方法循环遍历FXML元素,我希望它能识别TextFields并将它们添加到列表中: 然后,文本字段列表返回到此方法,其中文本字段被循环并清除: 现实: 在

  • 我有一个大学项目正在进行,我被这个错误困住了,找不到解决方案。首先是加载列表的JSP文件 还有ReST客户端访问权限 在我拿到模型之后 最后,巨大的错误屏幕 这是我第一次学习java,我完全不知道自己做错了什么。我知道xml列表的链接工作正常。