用java去解析一个最简单的XML文件,java解析xml
分享于 点击 28375 次 点评:24
用java去解析一个最简单的XML文件,java解析xml
此处仅仅是去解析最基本的XML文件,XML文件如下:<Books> <Book> <Name>Java入门</Name> <Price>30.00</Price> </Book> <Book> <Name>Java基础</Name> <Price>130.00</Price> </Book> <Book> <Name>Java精通</Name> <Price>256.00</Price> </Book> <Book> <Name>Java进阶</Name> <Price>998.00</Price> </Book> <Book> <Name>程序员之禅</Name> <Price>122.00</Price> </Book> <Book> <Name>颈椎指南</Name> <Price>50.00</Price> </Book> <Book> <Name>活着</Name> <Price>26.00</Price> </Book> <Book/> </Books>
上图是一个书的XML文件,我们创建一个Book类用来存储上面的图书实体
package learn; public class Book implements Comparable<Book>{ private String name; private float price; public Book() { } public Book(String name, float price) { this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", price=" + price + '}'; } @Override public int hashCode() { System.out.println("Book.hashCode"); return ((int) price); } @Override public boolean equals(Object obj) { System.out.println("Book.equals"); if (obj instanceof Book) { Book book = (Book) obj; return price == book.price && name.equals(book.name); } return false; } @Override public int compareTo(Book o) { int result = (int) (price - o.price); if (result == 0) { result = name.compareTo(o.name); } return result; } }下面是解析XML的代码
package learn; import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test01 { public static void main(String[] args) { String str = "<Books>\n" + " <Book>\n" + " <Name>Java入门</Name>\n" + " <Price>30.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>Java基础</Name>\n" + " <Price>130.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>Java精通</Name>\n" + " <Price>256.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>Java进阶</Name>\n" + " <Price>998.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>程序员之禅</Name>\n" + " <Price>122.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>颈椎指南</Name>\n" + " <Price>50.00</Price>\n" + " </Book>\n" + " <Book>\n" + " <Name>活着</Name>\n" + " <Price>26.00</Price>\n" + " </Book>\n" + " <Book/>\n" + "</Books>"; List<Book> list = null; Stack<Book> stack = new Stack<>(); Pattern pattern = Pattern.compile("<(/?)([^<>/]+)(/?)>");//此正则可能匹配到的是<> Matcher matcher = pattern.matcher(str); Stack<Integer> last = new Stack<>();//用来存放匹配到的<>,里面没有/,记录匹配到的<>的末尾位置 while (matcher.find()) { if (matcher.group(1).isEmpty()) { //如果<...>里面的首个括号内是空 last.push(matcher.end()); //记录匹配到的<...>的末尾位置 switch (matcher.group(2)) { case "Books": list = new ArrayList<>(); break; case "Book": stack.push(new Book()); break; } if (!matcher.group(3).isEmpty()) { //匹配第三个括号里有/,即<../> last.pop(); //匹配到<../>,栈顶元素出栈 switch (matcher.group(2)) { case "Book": list.add(stack.pop()); break; } } } else {
//如果</...>里面的首个括号内不是空Integer pop = last.pop(); //记录上一个<..>或<../>的matcher.end() switch (matcher.group(2)) { case "Book": list.add(stack.pop()); break; case "Name": stack.peek().setName(str.substring(pop, matcher.start())); break; case "Price": stack.peek().setPrice(Float.parseFloat(str.substring(pop, matcher.start()))); break; } } } for (Book book : list) { //遍历得到的list,里面存入的是Book的实体 System.out.println(book); } }}
相关文章
- 暂无相关文章
用户点评