Java 附加xml文件时出现一个错误的
我正在尝试编写一个函数,将姓名和出生日期存储到.xml文件中。代码应该检查.xml文件是否已经存在。当文件不存在时,将创建一个新的.xml并输入数据。但是,当第二次调用该函数时,在追加时会出现杂散。请让我知道如何解决这个问题。我不熟悉java和xml解析,今天才刚刚开始。处理xml创建和附加的函数是xmlCreator 我正在粘贴下面的代码Java 附加xml文件时出现一个错误的,java,xml,Java,Xml,我正在尝试编写一个函数,将姓名和出生日期存储到.xml文件中。代码应该检查.xml文件是否已经存在。当文件不存在时,将创建一个新的.xml并输入数据。但是,当第二次调用该函数时,在追加时会出现杂散。请让我知道如何解决这个问题。我不熟悉java和xml解析,今天才刚刚开始。处理xml创建和附加的函数是xmlCreator 我正在粘贴下面的代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt
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时,第一行出现了。当我打开同一个文件进行附加时,第二个问题出现了。非常感谢,它解决了有两行的问题。谢谢你在旁注中指出细节。我会设法解决这个问题:你们是在回应旧的答案。我更新了答案,它也解决了你的其他问题。再次感谢你抽出时间来帮助我。长命百岁!