Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 附加xml文件时出现一个错误的_Java_Xml - Fatal编程技术网

Java 附加xml文件时出现一个错误的

Java 附加xml文件时出现一个错误的,java,xml,Java,Xml,我正在尝试编写一个函数,将姓名和出生日期存储到.xml文件中。代码应该检查.xml文件是否已经存在。当文件不存在时,将创建一个新的.xml并输入数据。但是,当第二次调用该函数时,在追加时会出现杂散。请让我知道如何解决这个问题。我不熟悉java和xml解析,今天才刚刚开始。处理xml创建和附加的函数是xmlCreator 我正在粘贴下面的代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt

我正在尝试编写一个函数,将姓名和出生日期存储到.xml文件中。代码应该检查.xml文件是否已经存在。当文件不存在时,将创建一个新的.xml并输入数据。但是,当第二次调用该函数时,在追加时会出现杂散。请让我知道如何解决这个问题。我不熟悉java和xml解析,今天才刚刚开始。处理xml创建和附加的函数是xmlCreator 我正在粘贴下面的代码

   import java.awt.*;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import javax.swing.*;
   import java.io.FileWriter;
   import java.nio.file.*;
   import javax.xml.parsers.DocumentBuilder;
   import javax.xml.parsers.DocumentBuilderFactory;
   import javax.xml.transform.OutputKeys;
   import javax.xml.transform.Transformer;
   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 Exercise1 extends JPanel implements ActionListener{


  String name;
  String dateOfBirth;

 //Labels to identify the fields
 JLabel nameLabel;
 JLabel dateOfBirthLabel;

 //Strings for the labels
 static String nameString = "Name";
 static String dateOfBirthString = "Date Of Birth (dd/mm/yyyy)";

 JTextField nameField;
 JTextField dateOfBirthField;

 JButton clearButton;
 JButton saveAndProceedButton;
 JButton bdayInNext5Days;

 int serialNumber = 0;
 FileWriter xmlFile;

 public Exercise1()
 {
 super (new BorderLayout());

 nameLabel = new JLabel(nameString);
 dateOfBirthLabel = new JLabel(dateOfBirthString);

 nameField = new JTextField ();
 nameField.setColumns(20);
 nameLabel.setLabelFor(nameField);

 dateOfBirthField = new JTextField ();
 dateOfBirthField.setColumns(20);
 dateOfBirthLabel.setLabelFor(dateOfBirthField);

 //Lay out the labels in a panel.
 JPanel labelPane = new JPanel(new GridLayout(0,1));
 labelPane.add(nameLabel);
 labelPane.add(dateOfBirthLabel);

 //Layout the text fields in a panel.
 JPanel fieldPane = new JPanel(new GridLayout(0,1));
 fieldPane.add(nameField);
 fieldPane.add(dateOfBirthField);

 clearButton = new JButton ("Clear");
 clearButton.addActionListener (this);

 saveAndProceedButton = new JButton ("Save and Proceed");
 saveAndProceedButton.addActionListener (this);
 serialNumber++;

 bdayInNext5Days = new JButton("Bday in next 5 days");
 bdayInNext5Days.addActionListener (this);
 //Put the panels in this panel, labels on left,
 //text fields on right.
 add(labelPane, BorderLayout.LINE_START);
 add(fieldPane, BorderLayout.CENTER);
 add(clearButton, BorderLayout.LINE_END);
 add(saveAndProceedButton, BorderLayout.SOUTH);
 add(bdayInNext5Days, BorderLayout.NORTH);
 }

 /**
  * Create the GUI and show it.  For thread safety,
  * this method should be invoked from the
  * event dispatch thread.
  */
 private static void createAndShowGUI() {
     //Create and set up the window.
     JFrame frame = new JFrame("Exercise 1");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     //Add contents to the window.
     frame.add(new Exercise1());

     //Display the window.
     frame.pack();
     frame.setVisible(true);
 }

 private void xmlCreator(String name, String dateOfBirth) throws Exception{

     Path path = Paths.get("Bday.xml");
     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
     DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
     Document document = null;
     Element element = null;
     Transformer transformer = null;
     TransformerFactory transformerFactory = null;

     if(Files.exists(path)) { 
         xmlFile = new FileWriter("Bday.xml",true);
         document = documentBuilder.parse("Bday.xml");
         element = document.getDocumentElement();
     }
     else{
         xmlFile = new FileWriter("Bday.xml",true);
         document = documentBuilder.newDocument();
         element = document.createElement("Birthday");
         document.appendChild(element);
     }
     Element Id = document.createElement("Id");
     Id.appendChild(document.createTextNode(Integer.toString(serialNumber)));
     element.appendChild(Id);

     Element xmlName = document.createElement("Name");
     xmlName.appendChild(document.createTextNode(name));
     Id.appendChild(xmlName);

     Element xmldateOfBirth = document.createElement("Date_Of_Birth");
     xmldateOfBirth.appendChild(document.createTextNode(dateOfBirth));
     Id.appendChild(xmldateOfBirth);

     DOMSource source = new DOMSource(document);
     transformerFactory = TransformerFactory.newInstance();
     transformer = transformerFactory.newTransformer();
     transformer.setOutputProperty(OutputKeys.INDENT, "yes");

     StreamResult streamResult = new StreamResult(xmlFile);

     transformer.transform(source, streamResult);

}
 public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();

        if (source == clearButton){
            nameField.setText("");
            dateOfBirthField.setText("");
        }
        else if(source == saveAndProceedButton){
            name = nameField.getText();
            dateOfBirth = dateOfBirthField.getText();
            try {
                xmlCreator(name,dateOfBirth);
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            nameField.setText("");
            dateOfBirthField.setText("");
            serialNumber++;
        }
        else{


        }


    }


public static void main (String[] args)
 {
       SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 //Turn off metal's use of bold fonts
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                 createAndShowGUI();
             }
         });
 }}
存储在.xml文件中的输出如下所示

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Birthday>
<Id>1<Name>asdasd</Name>
<Date_Of_Birth>123</Date_Of_Birth>
</Id>
</Birthday>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Birthday>
<Id>1<Name>asdasd</Name>
<Date_Of_Birth>123</Date_Of_Birth>
</Id>
<Id>2<Name>adss</Name>
<Date_Of_Birth>12</Date_Of_Birth>
</Id>

您不需要文件编写器来写入xml。当您将StreamResult与文件一起提供时,转换器将处理它

以下是修复问题的代码:

if(Files.exists(path)) { 
      document = documentBuilder.parse("Bday.xml");
      element = document.getDocumentElement();
}
else{
      document = documentBuilder.newDocument();
      element = document.createElement("Birthday");
      document.appendChild(element);
}
Element Id = document.createElement("Id");

Id.appendChild(document.createTextNode(Integer.toString(serialNumber)));
element.appendChild(Id);

Element xmlName = document.createElement("Name");
xmlName.appendChild(document.createTextNode(name));
Id.appendChild(xmlName);

Element xmldateOfBirth = document.createElement("Date_Of_Birth");
xmldateOfBirth.appendChild(document.createTextNode(dateOfBirth));
Id.appendChild(xmldateOfBirth);

DOMSource source = new DOMSource(document);
transformerFactory = TransformerFactory.newInstance();
transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

StreamResult streamResult = new StreamResult(new File("Bday.xml"));
transformer.transform( source, streamResult );

我所做的更改是删除FileWriter部分,并将StreamResult与新文件一起使用…

您所说的杂散是什么意思?另外一行是的,这是xml文件中的输出。1asdasd 123 1asdasd 123 2adss 12当我第一次创建文件Bday.xml时,第一行出现了。当我打开同一个文件进行附加时,第二个问题出现了。非常感谢,它解决了有两行的问题。谢谢你在旁注中指出细节。我会设法解决这个问题:你们是在回应旧的答案。我更新了答案,它也解决了你的其他问题。再次感谢你抽出时间来帮助我。长命百岁!