有一个问题问下大牛们,我想顺序读取xml里面的数据,代码不知道咋写,请教一下,这个问题困扰我好久了。
如图,比如这个xml,我想顺序读取出来,怎么做啊?
1.xml运用
ClassLoader cl = ReadAndWrite.class.getClassLoader();
URL url = cl.getResource("User.xml");
String f = url.getPath();
SAXReader reader = new SAXReader();
Document doc = null;
doc = reader.read(f);
//获得根节点
Element root = doc.getRootElement();
@SuppressWarnings("rawtypes")
//迭代器
Iterator iter = root.elementIterator();
while(iter.hasNext()){
//获取子元素
Element element = (Element)iter.next();
String mail1 = element.elementText("mail");
System.out.println("qwerqwrwer");
if(mail.equals(mail1)){
request.getSession().setAttribute("judge","false");
System.out.println("niahaiao");
//response.sendRedirect=把地址发送到浏览器端,让浏览器再请求,这是地址栏变的原因 request.getRequestDispatcher().forward=服务端的控制权转向,等于从一个servletClass跳到另一个servletClass或jsp继续运行,最后才返回所有的结果,所以地址栏不会变
request.getRequestDispatcher("Work1_2.jsp").forward(request,response);
}
}
request.getSession().setAttribute("judge","true");
request.getRequestDispatcher("Work1_3.jsp").forward(request,response);
} catch (Exception e) {
e.getMessage();
}
2.创建xml
Document document = DocumentHelper.createDocument();
//锭以根节点
Element users = document.addElement("users");
//定义子节点
Element user = users.addElement("user");
Element na = user.addElement("name");
Element mgrade = user.addElement("mgrade");
Element egrade = user.addElement("egrade");
//给子节点赋值
na.setText(name);
mgrade.setText(math);
egrade.setText(english);
//设置输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer =
new XMLWriter(new FileOutputStream(new File("D:/users.xml")),format);
writer.write(document);
writer.close();
}catch (Exception e) {
e.printStackTrace();
}
3.添加xml节点(文件路径要写绝对路径 不然不行 我也不知道嘛回事)
String name = request.getParameter("name");
String math = request.getParameter("math");
String english = request.getParameter("english");
try{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("D:/java Web 程序/jsj_3_20153697_5/src/Users.xml"));
//获得根节点
Element root = doc.getRootElement();
//定义子节点
Element user = root.addElement("user");
Element na = user.addElement("name");
na.setText(name);
Element mgrade = user.addElement("mgrade");
mgrade.setText(math);
Element egrade = user.addElement("egrade");
egrade.setText(english);
//设置输出格式
OutputFormat format = new OutputFormat(" ", true, "utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("D:/java Web 程序/jsj_3_20153697_5/src/Users.xml"), format);
writer.write(doc);
writer.close();
}catch (Exception e) {
e.printStackTrace();
}
3.修改XML
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String math = request.getParameter("math");
String eng = request.getParameter("english");
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("D:/java Web 程序/jsj_3_20153697_5/src/Users.xml"));
// 获得根节点
Element root = doc.getRootElement();
// 得到根节点的下的user节点列表
@SuppressWarnings("rawtypes")
List user = root.selectNodes("user");
@SuppressWarnings("rawtypes")
//迭代器
Iterator iter = user.iterator();
while (iter.hasNext()) {
// 获取该列表种的下一个元素 必须要有next() 不然会死循环
Element e = (Element) iter.next();//第一次执行此语句为获得第一个列表中的节点
String name1 = e.elementText("name");
if (name.equals(name1)) {
@SuppressWarnings("rawtypes")
//获取user(子)节点下的所有的子节点的综合
Iterator iter1 = e.elementIterator();
int i = 1;
while (iter1.hasNext()) {
//获取user下的单个节点 next()必须!!!!!!
Element element2 = (Element) iter1.next();
if (i == 2) {
element2.setText(math);
}
if(i == 3){
element2.setText(eng);
}
i++;
}
}
}
OutputFormat format = new OutputFormat("", true, "utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("D:/java Web 程序/jsj_3_20153697_5/src/Users.xml"),format);
writer.write(doc);
writer.close();
response.sendRedirect("Work2_1.jsp");
希望能帮到你
Scanner sc=new Scanner(new File("E:"+File.separator+"map.xml"));
while(sc.hasNextLine()){
String line=sc.nextLine();
Pattern pattern=Pattern.compile("value\\=\"([\\d])\"");
Matcher m=pattern.matcher(line);
if(m.find()){
System.out.println(m.group(1));
}
}
结果就是 1 2 3;
我觉得这是最简单的一种办法,当然,还有sax或dom解析xml都可以。
这是sax解析的。TestSAXParser这个类是测试用的,下面那个SAXParserOfXML是解析器
public class TestSAXParser{
public static void main(String[] args){
SAXParserFactory fact=SAXParserFactory.newInstance();
try {
SAXParser parser=fact.newSAXParser();
parser.parse("E:"+File.separator+"map.xml", new SAXParserOfXML() );
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
//下面这个类是解析器,里面的方法都是覆写父类的,有SAXParser的对象调用。
class SAXParserOfXML extends DefaultHandler{
public void startDocument(){
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
public void endDocument(){
System.out.println("\n");
}
public void startElement(String uri,String localName,String name,Attributes attributes){
System.out.print("<");
System.out.print(name);
if(attributes!=null){
for(int x=0;x<attributes.getLength();x++){
System.out.print(""+attributes.getQName(x)+"=\""+attributes.getValue(x)+"\"");
}
}
System.out.print(">");
}
public void characters(char[] ch,int start,int length){
System.out.print(new String(ch,start,length));
}
public void endElement(String uri,String localName,String name){
System.out.print("</");
System.out.print(name);
System.out.print(">");
}
}