尝试用java中的迭代器构建XML文件

尝试用java中的迭代器构建XML文件,java,xml,Java,Xml,我写了一些代码,用java从我的系统属性创建一个XML文件。它的工作方式正是我所希望的,但我真的(真的)不喜欢我最终使用like 5 if语句使它工作,因为我注意到没有任何属性超过4个分隔子字符串。 我更喜欢使用迭代器和某种hasNext()方法继续追加到元素上,直到字符串结束,但我什么都做不出来。 我找不到一种方法将最新的标记附加到循环中的最后一个标记上/将值添加到元素的末尾 这是我目前拥有的一个快速修复程序,可以让程序运行 Document doc = docBuilder.newDocum

我写了一些代码,用java从我的系统属性创建一个XML文件。它的工作方式正是我所希望的,但我真的(真的)不喜欢我最终使用like 5 if语句使它工作,因为我注意到没有任何属性超过4个分隔子字符串。 我更喜欢使用迭代器和某种hasNext()方法继续追加到元素上,直到字符串结束,但我什么都做不出来。 我找不到一种方法将最新的标记附加到循环中的最后一个标记上/将值添加到元素的末尾

这是我目前拥有的一个快速修复程序,可以让程序运行

Document doc = docBuilder.newDocument();
    Element rootElement = doc.createElement("JAVA");
    doc.appendChild(rootElement);

    Iterator it = hm.entrySet().iterator();
    while (it.hasNext()) 
    {
        Map.Entry entry = (Map.Entry) it.next();
        String keyString = (String)entry.getKey();
        String val = (String)entry.getValue();
        java.util.List<String> sa = Arrays.asList(keyString.split("\\."));

        Iterator ait = sa.iterator();

        Element tag = doc.createElement((String) ait.next());
        rootElement.appendChild(tag);

        Element tag2 = null;
        Element tag3 = null;
        Element tag4 = null;
        Element tag5 = null;

        while(ait.hasNext())
        {   
            if(ait.hasNext())
            {    
            tag2 = doc.createElement((String)ait.next());
            tag.appendChild(tag2);
            if(!ait.hasNext())
                tag2.appendChild(doc.createTextNode(val)); 

            }
            if(ait.hasNext())
            {    
            tag3=doc.createElement((String)ait.next());
            tag2.appendChild(tag3);
                if(!ait.hasNext())
                    tag3.appendChild(doc.createTextNode(val)); 
            }
            if(ait.hasNext())
            {    
            tag4=doc.createElement((String)ait.next());
            tag3.appendChild(tag4);
            if(!ait.hasNext())
                tag4.appendChild(doc.createTextNode(val)); 
            }
            if(ait.hasNext())
            {    
            tag5=doc.createElement((String)ait.next());
            tag5.appendChild(tag5);
            if(!ait.hasNext())
                tag5.appendChild(doc.createTextNode(val)); 
            }

        }

    }

    Transformer transformer = null;
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    try
    {
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("XMLtester"));

        transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        transformer.transform(source, result);

    } catch (TransformerConfigurationException e)
    {
        e.printStackTrace();
    } catch (TransformerException e)
    {
        e.printStackTrace();
    }
    catch(NullPointerException e)
    {
        System.out.println("ERROR: " + e.toString());
    }
    System.out.println("File saved!");
Document doc=docBuilder.newDocument();
Element rootElement=doc.createElement(“JAVA”);
doc.appendChild(rootElement);
迭代器it=hm.entrySet().Iterator();
while(it.hasNext())
{
Map.Entry=(Map.Entry)it.next();
String keyString=(String)entry.getKey();
String val=(String)entry.getValue();
java.util.List sa=Arrays.asList(keyString.split(“\\”);
迭代器ait=sa.Iterator();
元素标签=doc.createElement((字符串)ait.next());
appendChild(标记);
元素tag2=null;
元素tag3=null;
元素tag4=null;
元素tag5=null;
while(ait.hasNext())
{   
if(ait.hasNext())
{    
tag2=doc.createElement((字符串)ait.next());
tag.appendChild(tag2);
如果(!ait.hasNext())
tag2.appendChild(doc.createTextNode(val));
}
if(ait.hasNext())
{    
tag3=doc.createElement((字符串)ait.next());
tag2.追加子项(tag3);
如果(!ait.hasNext())
tag3.appendChild(doc.createTextNode(val));
}
if(ait.hasNext())
{    
tag4=doc.createElement((字符串)ait.next());
tag3.追加子项(tag4);
如果(!ait.hasNext())
tag4.appendChild(doc.createTextNode(val));
}
if(ait.hasNext())
{    
tag5=doc.createElement((字符串)ait.next());
tag5.追加子项(tag5);
如果(!ait.hasNext())
tag5.appendChild(doc.createTextNode(val));
}
}
}
变压器=零;
TransformerFactory TransformerFactory=TransformerFactory.newInstance();
尝试
{
DOMSource=新的DOMSource(doc);
StreamResult=新的StreamResult(新文件(“XMLtester”);
transformer=transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(“{http://xml.apache.org/xslt}缩进金额,“2”);
变换(源、结果);
}捕获(TransformerConfiguration异常e)
{
e、 printStackTrace();
}捕获(转换异常e)
{
e、 printStackTrace();
}
捕获(NullPointerException e)
{
System.out.println(“错误:+e.toString());
}
System.out.println(“文件已保存!”);

如果有人对如何使其更灵活或优雅一些,以便接受任意数量的分隔子字符串有任何想法,我将不胜感激

我想这就是你想要的

Element destination = rootElement;
Element tag = null;
while (ait.hasNext()) {
    tag = doc.createElement((String) ait.next());
    destination.appendChild(tag);
    destination = tag;
}
destination.appendChild(doc.createTextNode(val));
示例输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<JAVA>
  <java>
    <runtime>
      <name>Java(TM) SE Runtime Environment</name>
    </runtime>
  </java>
  <sun>
    <boot>
      <library>
        <path>/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib</path>
      </library>
    </boot>
  </sun>
  <java>
    <vm>
      <version>23.0-b19</version>
    </vm>
  </java>
  <user>
    <country>
      <format>GB</format>
    </country>
  </user>

Java(TM)SE运行时环境
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib
23.0-b19
国标
完整工作示例:

import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class StackOverflow23556822 {

    public static void main(String[] args) throws ParserConfigurationException,
            TransformerException {
        DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = docBuilder.newDocument();
        Element rootElement = doc.createElement("JAVA");
        doc.appendChild(rootElement);

        Iterator<?> it = System.getProperties().entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next();
            String keyString = (String) entry.getKey();
            String val = (String) entry.getValue();
            List<String> sa = Arrays.asList(keyString.split("\\."));

            Iterator<?> ait = sa.iterator();

            Element destination = rootElement;
            Element tag = null;
            while (ait.hasNext()) {
                tag = doc.createElement((String) ait.next());
                destination.appendChild(tag);
                destination = tag;
            }
            destination.appendChild(doc.createTextNode(val));

        }

        Transformer transformer = null;
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("xml-test.xml"));

        transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(
                "{http://xml.apache.org/xslt}indent-amount", "2");
        transformer.transform(source, result);

        System.out.println("File saved!");
    }
}
导入java.io.File;
导入java.util.array;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.OutputKeys;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
公共类堆栈溢出23556822{
公共静态void main(字符串[]args)引发ParserConfiguration异常,
变换异常{
DocumentBuilder docBuilder=DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc=docBuilder.newDocument();
Element rootElement=doc.createElement(“JAVA”);
doc.appendChild(rootElement);
迭代器it=System.getProperties().entrySet().Iterator();
while(it.hasNext()){
Map.Entry=(Map.Entry)it.next();
String keyString=(String)entry.getKey();
String val=(String)entry.getValue();
List sa=Arrays.asList(keyString.split(“\\”);
迭代器ait=sa.Iterator();
元素目的地=根元素;
元素标记=null;
while(ait.hasNext()){
tag=doc.createElement((字符串)ait.next());
destination.appendChild(标签);
目的地=标签;
}
destination.appendChild(doc.createTextNode(val));
}
变压器=零;
TransformerFactory TransformerFactory=TransformerFactory
.newInstance();
DOMSource=新的DOMSource(doc);
StreamResult=newstreamresult(新文件(“xml test.xml”);
transformer=transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}缩进金额,“2”);
变换(源、结果);
System.out.printl