利用正則表達式解析簡單XML

人生的第二篇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 + '\'' +
            '}';
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章