利用正則表示式解析簡單XML
阿新 • • 發佈:2019-01-24
人生的第二篇CSDN部落格,還是好激動啊~
package homework;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Administrator on 2016/8/2.
*/
/*
解析XML語句,利用list儲存解析出的Shu的物件:
當group(0)為空時說明是標籤開始時,如果是Books說明是一組新的
組,所以new一個儲存結果的列表arraylist儲存Shu,當為Book時建立一個Shu物件放入臨時棧stack,判斷group(3),如果不為空
說明是<Book/>這種情況,直接將stack中未被設定過內容的Shu彈出放入list結果集.
當group(0)不為空時,說明是標籤的結束,如果是Book將臨時棧頂的Shu彈出並放入最終list,如果是Name或者Price則對
棧頂的物件呼叫peek()修改內容
*/
public class JiexiShu {
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<Shu> list = null;
Stack<Shu> stack = new Stack<>();
Stack<Integer> last = new Stack<>();
Pattern pattern=Pattern.compile("<(/?)([^<>/]+)(/?)>");
Matcher matcher=pattern.matcher(str);
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 Shu());
break;
}
if (!matcher.group(3).isEmpty()){
last.pop();
switch (matcher.group(2)){
case "Book":
list.add(stack.pop());
break;
}
}
}else {
switch (matcher.group(2)){
case "Name":
stack.peek().setName(str.substring(last.pop(),matcher.start()));
break;
case "Price":
stack.peek().setId(str.substring(last.pop(),matcher.start()));
break;
case "Book" :
list.add(stack.pop());
break;
}
}
}
for (Shu shu : list) {
System.out.println(shu);
}
}
}
class Shu:
package homework;
/**
* Created by Administrator on 2016/8/2.
*/
public class Shu {
private String name;
private String id;
public Shu() {
}
public Shu(String name, String id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Shu{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
}