Java 使用DOM解析器将XML文件输出到文本文件?

Java 使用DOM解析器将XML文件输出到文本文件?,java,xml,parsing,dom,Java,Xml,Parsing,Dom,好吧,在有人问我为什么对XML文件使用DOM解析器而不是SAX之前,原因很简单。我觉得DOM比SAX更容易使用,因为我的XML文件通常非常小,所以通过SAX解析它不需要太多内存,而SAX是一个基于事件的XML解析器,它一步一步地解析XML文件,这适合于大型XML文件 现在我在这里有一个示例XML文件: <?xml version="1.0"?> <schedule id="backup" duration="86400"> <datapoint time="0" s

好吧,在有人问我为什么对XML文件使用DOM解析器而不是SAX之前,原因很简单。我觉得DOM比SAX更容易使用,因为我的XML文件通常非常小,所以通过SAX解析它不需要太多内存,而SAX是一个基于事件的XML解析器,它一步一步地解析XML文件,这适合于大型XML文件

现在我在这里有一个示例XML文件:

<?xml version="1.0"?>
<schedule id="backup" duration="86400">
<datapoint time="0" speed="1" speednoise=".5" concurrency="8" concurrencynoise="1" interval="300" intervalnoise="300"/> <!-- 12am -->
<datapoint time="7200" speed="1" speednoise=".5" concurrency="8" concurrencynoise="1" interval="300" intervalnoise="300"/> <!-- 2am -->
<datapoint time="7201" speed="1" speednoise=".5" concurrency="0" concurrencynoise="0" interval="300" intervalnoise="300"/> <!-- 2:00:01am -->
<datapoint time="86399" speed="1" speednoise=".5" concurrency="0" concurrencynoise="0" interval="10" intervalnoise="0"/>  <!-- 11:59:59pm -->
</schedule>

但是它没有像我想的那样保存到文本文件中。

请添加
writer.flush()就在写有
writer.close()的行之前

close()通常也调用flush(),但我总是调用
writer.flush()
原因是,在某些JDK实现中,作为关闭的一部分,刷新引发的任何异常都会被吞没。以下是相关的so线程:。向下滚动至@Jon Skeet answer

请添加
writer.flush()就在写有
writer.close()的行之前

close()通常也调用flush(),但我总是调用
writer.flush()
原因是,在某些JDK实现中,作为关闭的一部分,刷新引发的任何异常都会被吞没。以下是相关的so线程:。向下滚动到@Jon Skeet answer

您的外部
for
循环正在迭代
元素。元素没有任何子节点(
是空元素),因此从未输入
if
语句,这意味着从未向
编写器写入任何内容


您可能打算迭代数据点元素的属性。由于属性顺序可能是任意的,所以迭代不是最优的,所以您应该按名称获取它们,就像您在print语句中所做的那样。

for
的外部
循环正在迭代
元素。元素没有任何子节点(
是空元素),因此从未输入
if
语句,这意味着从未向
编写器写入任何内容


您可能打算迭代数据点元素的属性。由于属性顺序可能是任意的,所以迭代不是最优的,所以您应该按名称获取它们,就像您在print语句中所做的那样。

解析器用于读取。有没有办法使用其他代码将输出保存到文本文件中@ElliottFrisch尝试将
getTextContent()
的所有用法替换为
getNodeValue()
。“文本内容”通常指元素的内部内容,而不是属性的值。@VGR仍然不能工作:(解析器用于读取。是否有任何方法可以使用其他代码将输出保存到文本文件中?@ElliottFrischTry将
getTextContent()
的所有用法替换为
getNodeValue()
“文本内容”通常是指元素的内部内容,而不是属性的值。@VGR仍然不能工作:(从:“关闭流,首先刷新它。”close()始终意味着flush()。@VGR是否会根据更新的注释重新考虑下一票?即使在Jon提到的JDK实现中,flush()始终被调用。从:“关闭流,首先刷新它。”close()始终意味着flush()。@VGR您会根据更新的注释重新考虑否决票吗?即使在Jon提到的JDK实现中,flush()始终被调用。但即使我这样做了,它也不会更改任何内容,因为这个“数据点”元素用于从文件中获取属性并在控制台中输出。这是我的理解。抱歉,如果我错了,我对Java还是比较陌生的。:(我的第二段提到的是内部迭代,而不是外部循环。但即使我这样做了,它也不会改变任何东西,因为这个“数据点”元素用于从文件中获取属性并将其输出到控制台中。这是我的理解。抱歉,如果我错了,我对Java还是比较陌生的。:(我的第二段提到的是内部迭代,而不是外部循环。
 try {
        //this is the text file that i want to write into
        BufferedWriter writer = new BufferedWriter(new FileWriter("new_backup.txt"));
        //this is the file that i want to read from
        File fXmlFile = new File("backup.xml");

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();
        NodeList nList = doc.getElementsByTagName("datapoint");
        for (int i = 0; i < nList.getLength(); i++) {
            Node node = nList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) node;
                System.out.println("Time : " + eElement.getAttribute("time"));
                System.out.println("Speed : " + eElement.getAttribute("speed"));
                System.out.println("SpeedNoise : " + eElement.getAttribute("speednoise"));
                System.out.println("Concurrency : " + eElement.getAttribute("concurrency"));
                System.out.println("ConcurrencyNiose : " + eElement.getAttribute("concurrencynoise"));
                System.out.println("Interval : " + eElement.getAttribute("interval"));
                System.out.println("IntervalNoise : " + eElement.getAttribute("intervalnoise"));
                if (eElement.hasChildNodes()) {
                    NodeList nl = node.getChildNodes();
                    for (int j = 0; j < nl.getLength(); j++) {
                        Node nd = nl.item(j);
                        String name = nd.getTextContent();
                        if (name != null && !name.trim().equals("")) {
                            System.out.print(name.trim() + ",");
                            //System.out.print(" ");
                            writer.write(nd.getTextContent().trim() + " ");
                        }

                    }
                    System.out.println("");
                    writer.write("\n");
                }
            }
        }
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@SuppressWarnings("unused")
private static String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    return nValue.getNodeValue();
}
}
Console Output: Time : 0
Speed : 1
SpeedNoise : .5
Concurrency : 8
ConcurrencyNiose : 1
Interval : 300
IntervalNoise : 300
Time : 7200
Speed : 1
SpeedNoise : .5
Concurrency : 8
ConcurrencyNiose : 1
Interval : 300
IntervalNoise : 300
Time : 7201
Speed : 1
SpeedNoise : .5
Concurrency : 0
ConcurrencyNiose : 0
Interval : 300
IntervalNoise : 300
Time : 86399
Speed : 1
SpeedNoise : .5
Concurrency : 0
ConcurrencyNiose : 0
Interval : 10
IntervalNoise : 0