Java 在给定位置向xml文件添加新元素

Java 在给定位置向xml文件添加新元素,java,xml,jdom,Java,Xml,Jdom,我正在尝试向xml文件中添加两个元素,并将它们放在标记之后,这样我创建了一个新的子元素列表,其中包含属性标记、新参数,然后是其余的rootnode子元素,如下所示: public void addParameters(Element rootNode) { Element resourcesParameter; Element subreportsParameter; List<Element> children; List<Element&

我正在尝试向xml文件中添加两个元素,并将它们放在标记之后,这样我创建了一个新的子元素列表,其中包含属性标记、新参数,然后是其余的rootnode子元素,如下所示:

public void addParameters(Element rootNode) {

    Element resourcesParameter;
    Element subreportsParameter;

    List<Element> children;
    List<Element> newChildren;
    children = rootNode.getChildren("property", Namespace.getNamespace("http://jasperreports.sourceforge.net/jasperreports"));

    System.out.println("AAAAAAAAAAAAAAAAA " + Collections.indexOfSubList(rootNode.getChildren(), children));

    newChildren = rootNode.getChildren().subList(0, children.size());
    System.out.println(" size with property : " + newChildren.size() );

    resourcesParameter =  addParameter("RESOURCES_DIR", "resources");
    newChildren.add(resourcesParameter);
    System.out.println(" size with resources : " + newChildren.size() );


    subreportsParameter =  addParameter("SUBREPORT_DIR", "subreports" );
    newChildren.add(subreportsParameter);
    System.out.println(" size with subreports : " + newChildren.size() );
    for(int i =0; i< newChildren.size(); i++) {
        System.out.println("newchildren element " + i + " :" + newChildren.get(i) );
    }

    List<Element> rest = rootNode.getChildren().subList(children.size() + 2, rootNode.getChildren().size());
    System.out.println(" size rest : " + rest.size() );
    for(int i =0; i< rest.size(); i++) {
        System.out.println(" rest element " + i + " :" + rest.get(i) );
    }

    newChildren.addAll(rest);
    System.out.println("size newchildren : " + newChildren.size() );

    rootNode.getChildren().clear();
    rootNode.getChildren().addAll(newChildren);

}
预期的xml文件应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report name" pageWidth="595" pageHeight="842" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<property name="ireport.zoom" value="1.5"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="384"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["subreports/"]]></defaultValueExpression>
</parameter>
<parameter name="RESOURCES_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["resources/"]]></defaultValueExpression>
</parameter>
<queryString language="xPath">
    <![CDATA[/pages/page]]>
</queryString>
<field name="noClt" class="java.lang.String">
    <fieldDescription><![CDATA[noClt]]></fieldDescription>
</field>
<field name="noFact" class="java.lang.String">
    <fieldDescription><![CDATA[noFact]]></fieldDescription>
</field>
<field name="sarlatLe" class="java.lang.String">
    <fieldDescription><![CDATA[sarlatLe]]></fieldDescription>
</field>
<field name="noPage" class="java.lang.String">
    <fieldDescription><![CDATA[noPage]]></fieldDescription>
</field>
<field name="adresseligne1" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne1]]></fieldDescription>
</field>
<field name="adresseligne2" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne2]]></fieldDescription>
</field>
<field name="adresseligne3" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne3]]></fieldDescription>
</field>
<field name="adresseligne4" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne4]]></fieldDescription>
</field>
<field name="adresseligne5" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne5]]></fieldDescription>
</field>
    .....
 </jasperReport>
有人能帮我吗?

试试这个:

newChildren=newarraylist(rootNode.getChildren().subList(0,children.size())

尝试以下操作:


newChildren=newarraylist(rootNode.getChildren().subList(0,children.size())

您能将代码发布到
addParameter()
中吗?堆栈跟踪报告错误在该方法中。您可以通过sysoutpliese刷新我添加的页面来放置newChildren和rest列表的内容吗?然后发布预期xml的示例(简单)?您可以在
addParameter()
中发布代码吗?堆栈跟踪报告错误在该方法中。您可以通过sysoutplie刷新我添加的页面,将newChildren和rest列表的内容放入其中,然后发布预期xml的示例(简单)?
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report name" pageWidth="595" pageHeight="842" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<property name="ireport.zoom" value="1.5"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="384"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["subreports/"]]></defaultValueExpression>
</parameter>
<parameter name="RESOURCES_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["resources/"]]></defaultValueExpression>
</parameter>
<queryString language="xPath">
    <![CDATA[/pages/page]]>
</queryString>
<field name="noClt" class="java.lang.String">
    <fieldDescription><![CDATA[noClt]]></fieldDescription>
</field>
<field name="noFact" class="java.lang.String">
    <fieldDescription><![CDATA[noFact]]></fieldDescription>
</field>
<field name="sarlatLe" class="java.lang.String">
    <fieldDescription><![CDATA[sarlatLe]]></fieldDescription>
</field>
<field name="noPage" class="java.lang.String">
    <fieldDescription><![CDATA[noPage]]></fieldDescription>
</field>
<field name="adresseligne1" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne1]]></fieldDescription>
</field>
<field name="adresseligne2" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne2]]></fieldDescription>
</field>
<field name="adresseligne3" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne3]]></fieldDescription>
</field>
<field name="adresseligne4" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne4]]></fieldDescription>
</field>
<field name="adresseligne5" class="java.lang.String">
    <fieldDescription><![CDATA[groupeAdresse/ligne5]]></fieldDescription>
</field>
    .....
 </jasperReport>
Exception in thread "AWT-EventQueue-0" org.jdom2.IllegalAddException: The Content already has an existing parent "jasperReport"
at org.jdom2.ContentList.checkPreConditions(ContentList.java:211)
at org.jdom2.ContentList.add(ContentList.java:244)
at org.jdom2.ContentList$FilterList.addAll(ContentList.java:1067)
at java.util.SubList.addAll(AbstractList.java:684)
at java.util.SubList.addAll(AbstractList.java:674)
at fr.srd.remap.ui.gui.ProjectExporter.addParameters(ProjectExporter.java:387)
at fr.srd.remap.ui.gui.ProjectExporter.prepareProject(ProjectExporter.java:140)
at fr.srd.remap.ui.gui.ProjectExporter.editReportFiles(ProjectExporter.java:208)
at fr.srd.remap.ui.gui.ProjectExporter.editReportFiles(ProjectExporter.java:167)
at fr.srd.remap.ui.gui.ProjectExporter.editReportFiles(ProjectExporter.java:167)
at fr.srd.remap.ui.gui.ProjectExporter.editReportFiles(ProjectExporter.java:167)
at fr.srd.remap.ui.gui.ProjectExporter.prepareProject(ProjectExporter.java:132)
at fr.srd.remap.ui.gui.ProjectExporter.export(ProjectExporter.java:59)