使用StAX修改一个XML文件

时间:2015-04-21 12:29:08

标签: java xml stax

我有以下xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee ID="1">
        <Firstname>David</Firstname >
        <Lastname>Berkley</Lastname>
        <Age>30</Age>
        <Salary>25001</Salary>
    </Employee>
    <Employee ID="2">
        <Firstname>Ashton</Firstname>
        <Lastname>Hutt</Lastname>
        <Age>22</Age>
        <Salary>26000</Salary>
    </Employee>

</Employees>

我希望在此XML文件中添加更多字段,如:

1)新员工。

2)新的员工详细信息,如地址,此处不存在。

3)删除上一条记录。

从用户那里获取适当的值后,我可以通过我的java代码相应地修改XML。

假设在执行第1点和第2点后,我的新xml变为......

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee ID="1">
            <Firstname>David</Firstname >
            <Lastname>Berkley</Lastname>
            <Age>30</Age>
            <Salary>25001</Salary>
            <Address>10th cross,Park Avenue</Address>
        </Employee>
        <Employee ID="2">
            <Firstname>Ashton</Firstname>
            <Lastname>Hutt</Lastname>
            <Age>22</Age>
            <Salary>26000</Salary>
        </Employee>
    <Employee ID="3">
        <Firstname>Holly</Firstname>
        <Lastname>Becker</Lastname>
        <Age>24</Age>
        <Salary>30000</Salary>
    </Employee>

</Employees>

如何使用StAX解析器实现此目的?请帮助我提供一些适当的提示和代码,以便我如何实现这一目标。 :(

编辑1

这是我希望在添加任何新记录时调用的函数。

public void addNewEmployee(XMLStreamWriter writer,String newID, String firstN, String lastN, String age, String salary)
    {


         try 
         {


             writer.writeStartDocument();
             writer.writeStartElement("Employee");
             writer.writeAttribute("ID", newID);



             writer.writeStartElement("Firstname");
             writer.writeCharacters(firstN);
             writer.writeEndElement();

             writer.writeStartElement("Lastname");
             writer.writeCharacters(lastN);
             writer.writeEndElement();

             writer.writeStartElement("Age");
             writer.writeCharacters(age);
             writer.writeEndElement();

             writer.writeStartElement("Salary");
             writer.writeCharacters(salary);
             writer.writeEndElement();



             writer.writeEndElement();
             writer.writeEndDocument();


             writer.flush();
             writer.close();
            // System.out.println("New Record Added");

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


    }

编辑2 我面临的另一个问题是在遍历之前的XML时....我如何遍历它以便我的光标在此块后面正确

<Employee ID="2">
            <Firstname>Ashton</Firstname>
            <Lastname>Hutt</Lastname>
            <Age>22</Age>
            <Salary>26000</Salary>
        </Employee>

在行</Employees>

之前

因为我需要在适当的时候拨打addNewEmployee()

1 个答案:

答案 0 :(得分:1)

我会指出一种新的/新颖的方式来做你所描述的,使用VTD-XML ...有很多原因可以解释为什么VTD-XML比为这个问题提供的所有其他解决方案要好得多。这里有几个链接...

http://www.javaworld.com/article/2071745/soa/simplify-xml-processing-with-vtd-xml.html

http://www.devx.com/xml/Article/36379

http://sdiwc.net/digital-library/request.php?article=0d947fb50e2f0160a75ac9f6bbf0818a

const no = [78787878,78787879, 787878780];

_.forEach(no, https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/'+no+'/info.xml', function (res) {
    res.on('data', function (chunk) {
        response_data += chunk;
    });
    res.on('end', function () {
        parser.parseString(response_data, function (err, result) {
            if (err) {
                console.log('Got error: ' + err.message);
            } else {
                console.log(util.inspect(result, false, null));
            }
        });
    });
    res.on('error', function (err) {
        console.log('Got error: ' + err.message);
    });
}));