如何通过Java将节点附加到XML中
当他们按下退出按钮时,他们的姓名和金额存储在一个XML文件中。我还可以读取那里的当前XML文件 向XML文件添加新节点时遇到问题如何通过Java将节点附加到XML中,java,xml,Java,Xml,当他们按下退出按钮时,他们的姓名和金额存储在一个XML文件中。我还可以读取那里的当前XML文件 向XML文件添加新节点时遇到问题 private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) { try { DocumentBuilderFactory documentBuilderFactory = Do
private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("scores.xml");
Element rootElement = document.createElement("scores");
document.appendChild(rootElement);
Element player = document.createElement("player");
Element playerName = document.createElement("name");
Element moneyAmount = document.createElement("money");
playerName.appendChild(document.createTextNode(name));
playerName.appendChild(document.createTextNode(String.valueOf(money)));
player.appendChild(playerName);
DOMSource source = new DOMSource(document);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
StreamResult result = new StreamResult("scores.xml");
transformer.transform(source, result);
System.exit(0);
}
catch (ParserConfigurationException ex) {
ex.printStackTrace();
} catch (SAXException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
当前XML:
<scores>
<player>
<name>Chief Sosa</name>
<money>1000</money>
</player>
</scores>
索萨酋长
1000
我想添加另一个玩家
期望的:
<scores>
<player>
<name>Chief Sosa</name>
<money>1000</money>
</player>
<player>
<name>Kobe</name>
<money>11000000</money>
</player>
</scores>
索萨酋长
1000
科比
11000000
有两种可能的解决方案:
1。通过setAttribute函数定义节点id。之后,xml文件将如下所示
创建一个玩家
最后是这个节点中的apendChild
2.另一个解决方案是使用document.getElementsByTagName(“分数”)代码>
循环此结果并附加节点
希望此帮助此帮助假定已存在分数文件
首先获取文档的“根”节点
然后,不要试图从变量name
和money
中添加“文本”
// This is creating a mess
Element player = document.createElement("player");
Element playerName = document.createElement("name");
Element moneyAmount = document.createElement("money");
playerName.appendChild(document.createTextNode(name));
playerName.appendChild(document.createTextNode(String.valueOf(money)));
player.appendChild(playerName);
您希望设置适当的节点文本内容
Element player = document.createElement("player");
Element playerName = document.createElement("name");
playerName.setTextContent(name);
Element moneyAmount = document.createElement("money");
moneyAmount.setTextContent(NumberFormat.getNumberInstance().format(money));
接下来,您要将name和money节点附加到player
元素
player.appendChild(playerName);
player.appendChild(moneyAmount);
然后将player
节点附加到“根”
已更新
你可以使用下面的
Document document = null;
File scores = new File("scores.xml");
if (scores.exists()) {
document = documentBuilder.parse("scores.xml");
} else {
document = documentBuilder.newDocument();
document.appendChild(document.createElement("scores"));
}
要加载或创建一个新文档(如果它不存在),请按照前面的示例使用附加代码
用示例更新…
使用
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = null;
File scores = new File("scores.xml");
if (scores.exists()) {
document = documentBuilder.parse("scores.xml");
} else {
document = documentBuilder.newDocument();
document.appendChild(document.createElement("scores"));
}
Element rootElement = document.getDocumentElement();
String name = "Kobe";
double money = 11000000;
Element player = document.createElement("player");
Element playerName = document.createElement("name");
playerName.setTextContent(name);
Element moneyAmount = document.createElement("money");
moneyAmount.setTextContent(NumberFormat.getNumberInstance().format(money));
player.appendChild(playerName);
player.appendChild(moneyAmount);
rootElement.appendChild(player);
DOMSource source = new DOMSource(document);
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty(OutputKeys.METHOD, "xml");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StreamResult result = new StreamResult(scores);
tf.transform(source, result);
} catch (ParserConfigurationException | SAXException | IOException | TransformerException ex) {
ex.printStackTrace();
}
从
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scores>
<player>
<name>Chief Sosa</name>
<money>1,000</money>
</player>
</scores>
索萨酋长
1,000
我能够生成
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scores>
<player>
<name>Chief Sosa</name>
<money>1,000</money>
</player>
<player>
<name>Kobe</name>
<money>11,000,000</money>
</player>
</scores>
索萨酋长
1,000
科比
11,000,000
这个问题似乎与Swing无关(注意:“GUI是使用Swing编写的”不算在内)。以后更仔细地应用标签。谢谢,但我有个问题?如果我用你的方式,我需要变压器吗?我遇到了一个问题,我必须抛出或声明transformer异常,您仍然需要在它的末尾导出XML。你所做的任何操作都是在模型的内存中完成的,而不是文档的来源。是的,好吧,我错过了一个例外。但当我退出时,它会转移到新的结果上。它最后放置了2个根元素。i、 e的东西!Stuff 2我不确定我知道你的意思,我已经发布了我测试的代码,肯定输入了错误的内容。谢谢你!
Document document = null;
File scores = new File("scores.xml");
if (scores.exists()) {
document = documentBuilder.parse("scores.xml");
} else {
document = documentBuilder.newDocument();
document.appendChild(document.createElement("scores"));
}
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = null;
File scores = new File("scores.xml");
if (scores.exists()) {
document = documentBuilder.parse("scores.xml");
} else {
document = documentBuilder.newDocument();
document.appendChild(document.createElement("scores"));
}
Element rootElement = document.getDocumentElement();
String name = "Kobe";
double money = 11000000;
Element player = document.createElement("player");
Element playerName = document.createElement("name");
playerName.setTextContent(name);
Element moneyAmount = document.createElement("money");
moneyAmount.setTextContent(NumberFormat.getNumberInstance().format(money));
player.appendChild(playerName);
player.appendChild(moneyAmount);
rootElement.appendChild(player);
DOMSource source = new DOMSource(document);
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty(OutputKeys.METHOD, "xml");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StreamResult result = new StreamResult(scores);
tf.transform(source, result);
} catch (ParserConfigurationException | SAXException | IOException | TransformerException ex) {
ex.printStackTrace();
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scores>
<player>
<name>Chief Sosa</name>
<money>1,000</money>
</player>
</scores>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<scores>
<player>
<name>Chief Sosa</name>
<money>1,000</money>
</player>
<player>
<name>Kobe</name>
<money>11,000,000</money>
</player>
</scores>