Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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文件添加新节点时遇到问题 private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) { try { DocumentBuilderFactory documentBuilderFactory = Do

当他们按下退出按钮时,他们的姓名和金额存储在一个XML文件中。我还可以读取那里的当前XML文件

向XML文件添加新节点时遇到问题

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>