【问题标题】:Save XML file to TXT in java在java中将XML文件保存到TXT
【发布时间】:2020-05-09 10:12:20
【问题描述】:

我从 XML 标记中检索到了我需要的数据。 我在这方面使用了相关包。 现在我想将结果保存在 .txt 文件中,但我不知道如何在我的代码中使用 FileWriter? 我尝试了几次,但我得到了一个空白文本文件,控制台中没有打印结果。任何人都可以帮助我将结果保存为txt?

package XMLConvertor;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class Sample {

  public static void main(String argv[]) {

    try {
//SourceFile
    File fXmlFile = new File("~/Downloads/Teacher.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

//归一化 doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
//Teacher name tags
    NodeList nList = doc.getElementsByTagName("TeacherName");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Name: " + eElement.getElementsByTagName("Name").item(0).getTextContent());
        }
        }

        }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
  }

}

【问题讨论】:

    标签: java xml tags package simple-xml-converter


    【解决方案1】:

    结果分享如下: 正如我所做的那样,这只是一个虚拟测试。我想知道如何将其保存在文本文件中?

    TeacherName 
    --------------------------------
    Sara 
    Marry
    John
    

    【讨论】:

      【解决方案2】:

      你在这里做了这个

      // write the content into xml file
          TransformerFactory transformerFactory = TransformerFactory.newInstance();
          Transformer transformer = transformerFactory.newTransformer();
          DOMSource source = new DOMSource(doc);
          StreamResult result = new StreamResult(new File("C:\\file.xml"));
      
          // Output to console for testing
          // StreamResult result = new StreamResult(System.out);
      
          transformer.transform(source, result);
      

      您可以在以下位置找到更多信息: https://mkyong.com/java/how-to-create-xml-file-in-java-dom/

      作为替代方案,您可以使用 transform 方法将其传递给 StringWriter。 你可以这样做是因为你有一个字符串

      StringWriter sw = new StrinWriter();
      transformer.transform(source, new StreamResult(sw));
      FileWriter fw = new FileWriter("file.txt")
      fw.write(sw.toString();
      fw.close()
      

      【讨论】:

      • 能否告诉我,我应该在源代码中的什么位置添加它?
      • 我会在解析和构建 xmltree 之后添加这个
      • 下面已经添加了:
      • 好的,我已经测试了这个代码,我已经注释掉了所有通过 xmltree 的代码。简而言之,恶作剧被写出来了。也许文件路径必须是绝对路径。
      • 我忘了说“~”是linux上的一个shortpath,java不理解。我认为最好通过将 ith 替换为 System.getProperty("user.home") 来处理“~”,这会根据当前用户的主目录为您提供绝对路径:)
      【解决方案3】:

      你在这里:

          package XMLConvertor;
          import javax.xml.parsers.DocumentBuilderFactory;
          import javax.xml.parsers.DocumentBuilder;
          import org.w3c.dom.Document;
          import org.w3c.dom.NodeList;
          import org.w3c.dom.Node;
          import org.w3c.dom.Element;
          import java.io.File;
          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
      
          public class Sample {
      
            public static void main(String argv[]) {
      
              try {
          //SourceFile
              File fXmlFile = new File("~/Downloads/Teacher.xml");
              DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
              DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
              Document doc = dBuilder.parse(fXmlFile);
      // write the content into xml file
          TransformerFactory transformerFactory = TransformerFactory.newInstance();
          Transformer transformer = transformerFactory.newTransformer();
          DOMSource source = new DOMSource(doc);
          StreamResult result = new StreamResult(new File("~/Downloads/file.xml"));
      
          // Output to console for testing
          // StreamResult result = new StreamResult(System.out);
      
          transformer.transform(source, result);
           System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
          //Teacher name tags
              NodeList nList = doc.getElementsByTagName("TeacherName");
      
              System.out.println("----------------------------");
      
              for (int temp = 0; temp < nList.getLength(); temp++) {
      
                  Node nNode = nList.item(temp);
      
                  System.out.println("\nCurrent Element :" + nNode.getNodeName());
      
                  if (nNode.getNodeType() == Node.ELEMENT_NODE) {
      
                      Element eElement = (Element) nNode;
      
                      System.out.println("Name: " + eElement.getElementsByTagName("Name").item(0).getTextContent());
                  }
                  }
      
                  }
              }
              } catch (Exception e) {
              e.printStackTrace();
              }
            }
      
          }
      

      【讨论】:

        【解决方案4】:

        这里是绝对路径的代码:

        File fXmlFile = new File("/home/user/Downloads/Teacher.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);
        
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                DOMSource source = new DOMSource(doc);
                StreamResult result = new StreamResult(new File("/home/user/Downloads/file.xml"));
                transformer.transform(source, result);
        

        这里我们替换了“~”:

        File fXmlFile = new File("~/Downloads/file.xml".replaceFirst("^~", System.getProperty("user.home")));
                    DocumentBuilderFactory dbFactory = 
          DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(fXmlFile);
        
                    TransformerFactory transformerFactory = TransformerFactory.newInstance();
                    Transformer transformer = transformerFactory.newTransformer();
                    DOMSource source = new DOMSource(doc);
                    StreamResult result = new StreamResult(new File("~/Downloads/file.xml".replaceFirst("^~", System.getProperty("user.home"))));
                    transformer.transform(source, result);
        

        【讨论】:

        • 我检查了你的代码。我只想将结果保存在文本文件中。我无法在任何路径中找到 .txt。我在上面共享的代码运行良好,在 Eclipse 中,我在控制台中看到了结果,现在我想将它以 txt 格式保存在我的桌面或下载中。我对java很陌生,我使用了filewriter,但它保存了一个空白文本文件而不是我的结果:-(
        • 好的,如果我知道您想将控制台中的输出写入文件?
        • 正是我想将结果保存在文本文件中。
        • 好的,那么我必须知道结果在你的 txt 文件中应该是怎样的。那是因为要知道我们可以从哪里开始收集结果以及何时可以将其保存到文件中。你也可以给我发一个虚拟的 xml 文件吗?
        • 是的,结果如下所示:
        【解决方案5】:

        好的,根据你的回答,我有这个代码给你,我已经使用了一个 Strin 构建器来存储输出并使用 FileWriter 将它们写入一个 txt 文件

         public static void main(String[] args)
        {
        
            try
            {
        
                File fXmlFile = new File("~/Downloads/Teacher.xml".replaceFirst("^~", System.getProperty("user.home")));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);
        
        
        
                System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
                //Teacher name tags
        
                StringBuilder result = new StringBuilder(doc.getDocumentElement().getNodeName() + "\n----------------------------\n");
        
                NodeList nList = doc.getElementsByTagName("TeacherName");
        
                System.out.println("----------------------------");
        
                for (int temp = 0; temp < nList.getLength(); temp++)
                {
                    Node nNode = nList.item(temp);
                    System.out.println("\nCurrent Element :" + nNode.getNodeName());
                    if (nNode.getNodeType() == Node.ELEMENT_NODE)
                    {
                        Element eElement = (Element) nNode;
                        System.out.println("Name: " + eElement.getElementsByTagName("Name").item(0).getTextContent());
                        result.append(String.format("%s\n", eElement.getElementsByTagName("Name").item(0).getTextContent()));
                    }
                }
        
                FileWriter writer = new FileWriter(new File("~/Downloads/file.xml".replaceFirst("^~", System.getProperty("user.home"))));
                writer.write(result.toString());
                writer.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        

        我已经测试了这个代码并且它运行了:)

        【讨论】:

        • 非常感谢。现在运行上面的代码后,我的文本文件将在下载目录中?
        • 应该存放在你的下载目录下:)
        • 很高兴听到:D
        • 非常感谢。只是另一个问题,我的结果类似于 TecherName: Mirabi ,现在使用上面的代码,我的文本文件中只有 TeacherName: ,而不是值。我可以修改代码以在文本文件中将我的所有输入作为 TeacherName: Mirabi 吗?
        • 是的,应该是:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-13
        • 2011-10-10
        • 1970-01-01
        相关资源
        最近更新 更多