创建与 Java 同名的多个 xml 元素的最佳方法是什么?
What is the best approach to create multiple xml elements with same name with Java?
假设我想创建这个 xml:
<root>
<element>
text 1
</element>
<element>
text 2
</element>
<element>
text 3
</element>
.
.
.
n elements
</root>
使用 java 循环,我在使用 jdom.element 创建它时遇到了问题,因为在第二次迭代时,它说已经有一个名为 "element" 的元素,我已经阅读一旦附加,你就不能创建更多相同的元素,所以使用克隆或其他东西,但我还没有弄清楚如何,我相信这应该相当简单。
int i = 0;
int n = 100;
while(i < n){
(Missing code)
}
缺少代码是我需要的。
编辑:抱歉懒惰,我添加了代码以更好地举例说明我需要做什么以及有效的方法,但是@rolfl 理解我想做什么和我的问题,他解决了它。谢谢你。再次抱歉大家偷懒了
我的代码:
Element eElements = new org.jdom.Element("Elements");
Element eElement;
Element eSubElement1 = new org.jdom.Element("SubElement1");
Element eSubElement2 = new org.jdom.Element("SubElement2");
int i = 0;
int n = 100;
while (i < n){
eSubElement1.setText("Text " + i);
eSubElement2.setText("Text " + i);
eElement = new org.jdom.Element("Element");
eElement.addContent(eSubElement1);
eElement.addContent(eSubElement2);
eElements.addContent(eElement);
}
我以为每次调用一个新的"Element"就足够了,但你也必须调用一个新的"SubElementX"。
有效的 While 循环:
while (i < n){
eSubElement1 = new org.jdom.Element("SubElement1").setText("Text " + i);
eSubElement2 = new org.jdom.Element("SubElement2").setText("Text " + i);
eElement = new org.jdom.Element("Element");
eElement.addContent(eSubElement1);
eElement.addContent(eSubElement2);
eElements.addContent(eElement);
}
对于 XML 处理 (marshalling/unmarshalling) 我建议使用 JAXB 而不是 jdom。
不知道你的确切用例(我假设它可能不仅仅是一个简单的文本,至少在理论上),我会使用代表 xml 元素的 POJO 和代表 xml-root 并且基本上只包含 xml-element-POJO 的列表。
这样,您将在 while 循环中使用 xml-element-POJO 填充 xml-root-POJO,完成后,您将 xml-root 交给-POJO 到 JAXB,用于将其编组为 xml-文件。
在您的情况下,POJO 可能应该被注释为 @XmlRootElement(name = "root")
和 @XmlElement(name = "element")
您显然是在尝试多次添加同一个实例,或者其他什么。您应该为每个值创建一个元素 "element" 的新实例。
类似于:
Element root = new Element("root");
for (int i = 0; i < 100; i++) {
root.addContent(new Element("element").setText("Text " + i));
}
然后使用 XMLOutputter
输出 root
元素(使用输出器上的 Format.getPrettyFormat()
以在结果中获得漂亮的空白。
假设我想创建这个 xml:
<root>
<element>
text 1
</element>
<element>
text 2
</element>
<element>
text 3
</element>
.
.
.
n elements
</root>
使用 java 循环,我在使用 jdom.element 创建它时遇到了问题,因为在第二次迭代时,它说已经有一个名为 "element" 的元素,我已经阅读一旦附加,你就不能创建更多相同的元素,所以使用克隆或其他东西,但我还没有弄清楚如何,我相信这应该相当简单。
int i = 0;
int n = 100;
while(i < n){
(Missing code)
}
缺少代码是我需要的。
编辑:抱歉懒惰,我添加了代码以更好地举例说明我需要做什么以及有效的方法,但是@rolfl 理解我想做什么和我的问题,他解决了它。谢谢你。再次抱歉大家偷懒了
我的代码:
Element eElements = new org.jdom.Element("Elements");
Element eElement;
Element eSubElement1 = new org.jdom.Element("SubElement1");
Element eSubElement2 = new org.jdom.Element("SubElement2");
int i = 0;
int n = 100;
while (i < n){
eSubElement1.setText("Text " + i);
eSubElement2.setText("Text " + i);
eElement = new org.jdom.Element("Element");
eElement.addContent(eSubElement1);
eElement.addContent(eSubElement2);
eElements.addContent(eElement);
}
我以为每次调用一个新的"Element"就足够了,但你也必须调用一个新的"SubElementX"。
有效的 While 循环:
while (i < n){
eSubElement1 = new org.jdom.Element("SubElement1").setText("Text " + i);
eSubElement2 = new org.jdom.Element("SubElement2").setText("Text " + i);
eElement = new org.jdom.Element("Element");
eElement.addContent(eSubElement1);
eElement.addContent(eSubElement2);
eElements.addContent(eElement);
}
对于 XML 处理 (marshalling/unmarshalling) 我建议使用 JAXB 而不是 jdom。
不知道你的确切用例(我假设它可能不仅仅是一个简单的文本,至少在理论上),我会使用代表 xml 元素的 POJO 和代表 xml-root 并且基本上只包含 xml-element-POJO 的列表。
这样,您将在 while 循环中使用 xml-element-POJO 填充 xml-root-POJO,完成后,您将 xml-root 交给-POJO 到 JAXB,用于将其编组为 xml-文件。
在您的情况下,POJO 可能应该被注释为 @XmlRootElement(name = "root")
和 @XmlElement(name = "element")
您显然是在尝试多次添加同一个实例,或者其他什么。您应该为每个值创建一个元素 "element" 的新实例。
类似于:
Element root = new Element("root");
for (int i = 0; i < 100; i++) {
root.addContent(new Element("element").setText("Text " + i));
}
然后使用 XMLOutputter
输出 root
元素(使用输出器上的 Format.getPrettyFormat()
以在结果中获得漂亮的空白。