Java stax-to-DOM转换器
我想使用Stax流读取器读取DOM文档,并使用Stax流编写器编写它。 我想修改xml文件并更改一些元素值 在构建dom树之前,我希望光标指向xml文件中的某个元素 我编写了这段代码,但xml文件没有修改 有人能帮我吗 FileInputStream输入=新建FileInputStreamcv.xml; XMLStreamReader=XMLInputFactory.newInstance.createXMLStreamReaderinput; BufferedReader in=新BufferedReadernew InputStreamReaderSystem.inJava stax-to-DOM转换器,java,Java,我想使用Stax流读取器读取DOM文档,并使用Stax流编写器编写它。 我想修改xml文件并更改一些元素值 在构建dom树之前,我希望光标指向xml文件中的某个元素 我编写了这段代码,但xml文件没有修改 有人能帮我吗 FileInputStream输入=新建FileInputStreamcv.xml; XMLStreamReader=XMLInputFactory.newInstance.createXMLStreamReaderinput; BufferedReader in=新Buffer
//-*-*- get new entries from input stream
System.out.println("<< CV >>\n -> Modify the first reference\n ** Modify The Name **");
System.out.print(" Enter degree : ");
String degree = in.readLine();
System.out.print(" Enter first name : ");
String fName = in.readLine();
System.out.print(" Enter last name : ");
String lName = in.readLine();
System.out.println(" ** Modify The Address ** ");
System.out.print(" Enter new city : ");
String newCity = in.readLine();
System.out.print(" Enter new country : ");
String newCountry = in.readLine();
//-*-*- let the reader point at the first "reference" element
int eventType;
boolean ref = false, fname = false;
while (reader.hasNext()) {
eventType = reader.next();
switch (eventType) {
case XMLEvent.START_ELEMENT:
if (reader.getLocalName().equalsIgnoreCase("references"))
return;
}
}
//-*-*- build DOM trees using Stax stream reader
Document doc = new DOMConverter().buildDocument(reader);
reader.close();
input.close();
//-*-*- start modification
Element firstRef = (Element)doc.getElementsByTagName("reference").item(0);
NodeList name = (NodeList)firstRef.getElementsByTagName("name");
//-*-*- modify the degree (Dr. , Eng. , Dev. ,etc)
Attr att = (Attr)name.item(0).getAttributes().item(0);
((Node)att).setNodeValue(degree);
//-*-*- modify first name
NodeList firstName = (NodeList)firstRef.getElementsByTagName("fname");
NodeList firstNameChilds = (NodeList)firstName.item(0).getChildNodes();
((Node)firstNameChilds.item(0)).setNodeValue(fName);
//-*-*- modify last name
NodeList lastName = (NodeList)firstRef.getElementsByTagName("lname");
NodeList lastNameChilds = (NodeList)lastName.item(0).getChildNodes();
((Node)lastNameChilds.item(0)).setNodeValue(lName);
//-*-*- modify city
NodeList city = (NodeList)firstRef.getElementsByTagName("city");
NodeList cityChilds = (NodeList)city.item(0).getChildNodes();
((Node)cityChilds.item(0)).setNodeValue(newCity);
//-*-*- modify country
NodeList country = (NodeList)firstRef.getElementsByTagName("country");
NodeList countryChilds = (NodeList)country.item(0).getChildNodes();
((Node)countryChilds.item(0)).setNodeValue(newCountry);
//-*-*- write DOM document
FileOutputStream out = new FileOutputStream("cv.xml");
XMLStreamWriter sw = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
new DOMConverter().writeDocument(doc, sw);
sw.close();
out.close();
这可能是因为找到references元素时正在返回。也许您的意思是break。不,我的意思是return,我想在XMLStreamReader匹配引用元素时停止while循环。因此,dom树从此元素开始返回将退出整个方法。我很确定你想打破这个循环。尝试将一些调试语句放在该循环之后,您就会明白我的意思。是的,关于return,您是对的,但当我使用break时,它将脱离开关,但在游标匹配引用元素后仍在循环中,并将到达documentRight的末尾,因此您需要一个更好的循环控制变量。尝试一个布尔值,该布尔值在开始时为false,在找到引用时设置为true。您仍然需要检查reader.hasNext。我尝试了以下方法:int eventType;布尔值ref=false,fname=false;while reader.hasNext{eventType=reader.next;switch eventType{case XMLEvent.START_元素:if reader.getLocalName.equalsIgnoreCasereferences{ref=true;break;}ifref break;}System.out.printlnI在这里;