Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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 使用StAX修改一个XML文件_Java_Xml_Stax - Fatal编程技术网

Java 使用StAX修改一个XML文件

Java 使用StAX修改一个XML文件,java,xml,stax,Java,Xml,Stax,我有以下xml文件 <?xml version="1.0" encoding="UTF-8"?> <Employees> <Employee ID="1"> <Firstname>David</Firstname > <Lastname>Berkley</Lastname> <Age>30</Age> <Sala

我有以下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>
编辑2 我面临的另一个问题是在遍历之前的XML时。。。。如何遍历它,使光标正好位于该块之后

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

阿什顿
赫特人
22
26000
在第


因为我需要在适当的时候调用
addNewEmployee()

您不应该每次调用该方法时都使用相同的文件路径创建新的写入程序,因为这将覆盖您的文件

仅创建(并关闭)编写器一次,并将其作为参数传递给方法:

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

我想为你指出一种新的/新颖的方法,通过使用。。。为什么VTD-XML比针对这个问题提供的所有其他解决方案都要好得多,原因有很多。。。这里有一些链接

导入com.ximpleware.*;
导入java.io.*;
公共类simpleMod{
公共静态void main(字符串s[])引发VTDException、IOException{
VTDGen vg=新VTDGen();
if(!vg.parseFile(“input.xml”,false))
返回;
VTDNav vn=vg.getNav();
XMLModifier xm=新的XMLModifier(vn);
自动驾驶仪ap=新自动驾驶仪(vn),ap2=新自动驾驶仪(vn);
ap.selectXPath(“/employees/employee[@ID='1']/Salary”);
ap2.选择XPath(“../../employee[@ID='2');
int i=ap.evalXPath();
如果(i==-1)
返回;
xm.insertAfterElement(“公园大道第十十字路口”);
i=ap2.evalXPath();
如果(i==-1)
返回;
xm.insertAfterElement(“\nHolly\nBecker\n24\n30000\n”);
output(“output.xml”);
}
}

你认为JAXB不是StAX吗?它可能更简单:定义XSD,生成JAXB类,unMARCURE文档,操作雇员对象列表,再次列出MasRead。你用STAX读写器有多远?你在哪里有问题?我已经用StAX适当地读取了数据,但是当我我正在尝试编写一些东西,internet上的大多数文档都使用XMLStreamWriter。我希望通过浏览XML文件来添加详细信息,或通过检查节点详细信息在适当的区域对其进行修改。但我很难弄清楚……转换到JAXB有点太晚了:(:(请向我们展示您到目前为止拥有的相关代码,并告诉我们当前的结果。@Puce:我添加了一个代码片段……告诉我您的想法和我应该如何处理……我试着按照您所说的那样做。旧文件仍在被删除。@DeepN您必须写入一个新文件,并写出您想要保留的元素。@DeepN我想,在使用STAX读取它的同时,我认为没有办法修改文件,但我可能错了。@ DeepN还考虑使用迭代器API(事件)代替游标API(流)。:确实,您不应该同时在同一个流中读写。您必须在新的输出中写入。解析后,您可以根据自己的意愿重命名该文件。@Puce…我已更新了我的代码段。无论如何…您是说每次需要追加旧的XML文件时,我都必须创建一个新的XML文件???PDF链接已断开。
<Employee ID="2">
            <Firstname>Ashton</Firstname>
            <Lastname>Hutt</Lastname>
            <Age>22</Age>
            <Salary>26000</Salary>
        </Employee>
public void addNewEmployee(XMLStreamWriter writer, String newID, String firstN, String lastN, String age, String salary)
import com.ximpleware.*;
import java.io.*;

public class simpleMod {
    public static void main(String s[]) throws VTDException,IOException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false))
            return;
        VTDNav vn = vg.getNav();
        XMLModifier xm = new XMLModifier(vn);
        AutoPilot ap = new AutoPilot(vn),ap2=new AutoPilot(vn);
        ap.selectXPath("/employees/employee[@ID='1']/Salary");
        ap2.selectXPath("../../employee[@ID='2'");
        int i=ap.evalXPath();
        if (i==-1)
            return; 
        xm.insertAfterElement("<Address>10th cross, Park Avenue</Address>");
        i=ap2.evalXPath();
        if (i==-1)
            return;
        xm.insertAfterElement(" <Employee ID=\"3\">\n<Firstname>Holly</Firstname>\n<Lastname>Becker</Lastname>\n<Age>24</Age>\n<Salary>30000</Salary>\n</Employee>");
        xm.output("output.xml");

    }
}