您的位置:首页 > Web前端 > HTML

后台如何解析html

2016-07-28 14:39 477 查看
 String str = "<p style=\"text-align: left;\">空白字体<b>只是斜体<i><u>斜体划线</u></i></b><i>1111111</i><b><u>加粗划线样式</u></b>空白字体<b><i>只是斜体<u>斜体划线</u></i></b></p>";

上面这个str字符串,如何解析出类似于 : 文字:该文字块有哪些属性(i/u/b)

//文字样式

public class FontStyle {

private boolean isB = false;//是否加粗
private boolean isU = false;//是否下划线
private boolean isI = false;//是否斜体

public Boolean getIsB() {
return isB;
}
public void setIsB(Boolean isB) {
this.isB = isB;
}
public Boolean getIsI() {
return isI;
}
public void setIsI(Boolean isI) {
this.isI = isI;
}
public Boolean getIsU() {
return isU;
}
public void setIsU(Boolean isU) {
this.isU = isU;
}

}
//文字块 包括文字内容和样式

public class BlockInfo {

private String words = "";// 文本区块str
private FontStyle WordsStyle = new FontStyle();// 文本区块的样式

public String getWords() {
return words;
}

public void setWords(String words) {
this.words = words;
}

public FontStyle getWordsStyle() {
return WordsStyle;
}

public void setWordsStyle(FontStyle wordsStyle) {
WordsStyle = wordsStyle;
}

}

//整个段落

public class ParagraphInfo {

private String text_align = "left";// 段落文本对齐方式
private String paragraphWord = "";// 段落文本
private List<BlockInfo> blockInfoList = new ArrayList<BlockInfo>();// 段落文本区块集合信息

public String getText_align() {
return text_align;
}
public void setText_align(String text_align) {
this.text_align = text_align;
}
public String getParagraphWord() {
return paragraphWord;
}
public void setParagraphWord(String paragraphWord) {
this.paragraphWord = paragraphWord;
}
public List<BlockInfo> getBlockInfoList() {
return blockInfoList;
}
public void setBlockInfoList(List<BlockInfo> blockInfoList) {
this.blockInfoList = blockInfoList;
}
}

public class Test {

//String str = "<p style=\"text-align: left;\"><i>只是斜体<u>斜体划线</u></i></p>";
public static void listAll(Node node, ParagraphInfo info, List<String> style) {
List<Node> nodes = node.childNodes();
String nodeName = node.nodeName(); // #text

if (nodes.size() == 0) {
BlockInfo blockInfo = new BlockInfo();
FontStyle fontStyle = blockInfo.getWordsStyle();
if(style.size() > 0){

String styles = style.get(0);
if (styles.contains("i")) {
fontStyle.setIsI(true);
}
if (styles.contains("u")) {
fontStyle.setIsU(true);
}
if (styles.contains("b")) {
fontStyle.setIsB(true);
}
style.remove(0);
}

String content = node.toString();
blockInfo.setWords(content);
List<BlockInfo> blockInfoList = info.getBlockInfoList();
blockInfoList.add(blockInfo);
return;
} else {
//如果不是叶子节点,则给List<String> style样式添加属性
for (int i = 0; i < nodes.size(); i++) {
if (style.size()>i && style.size() <= nodes.size()) {
style.set(i, style.get(i) + nodeName);
} else if(style.size()>0 && style.size()<=i) {
style.add(style.get(i-1));
}else{
style.add(nodeName);
}
}

}

for (Node n : nodes) {

listAll(n, info, style);

}

}

public static void main(String[] args) {

String str = "<p style=\"text-align: left;\">空白字体<b>只是斜体<i><u>斜体划线</u></i></b><i>1111111</i><b><u>加粗划线样式</u></b>空白字体<b><i>只是斜体<u>斜体划线</u></i></b></p>";
Document doc = Jsoup.parse(str);
Elements links = doc.getElementsByTag("p");

for (Element link : links) {
ParagraphInfo info = new ParagraphInfo();
info.setParagraphWord(link.text()); // 纯文本

List<Node> nodes = link.childNodes();
// 找到第一个p标签的<p>的结束位置
// int index =link.toString().indexOf(">");
for (Node node : nodes) {
List<String> style = new ArrayList<String>();

listAll(node, info, style);
}

System.out.println("~~~~~~~~~~~~~打印结果~~~~~~~~~~~~~~");

List<BlockInfo> blockInfoList = info.getBlockInfoList();

System.out.println(info.getParagraphWord());

for (BlockInfo b : blockInfoList) {
System.out.println(b.getWords());
System.out.println("B: " + b.getWordsStyle().getIsB() + "====" + "U: " + b.getWordsStyle().getIsU() + "====" + "I: " + b.getWordsStyle().getIsI());
}

}

}

}

打印的结果如下 :

~~~~~~~~~~~~~打印结果~~~~~~~~~~~~~~
空白字体只是斜体斜体划线1111111加粗划线样式空白字体只是斜体斜体划线
空白字体
B: false====U: false====I: false
只是斜体
B: true====U: false====I: false
斜体划线
B: true====U: true====I: true
1111111
B: false====U: false====I: true
加粗划线样式
B: true====U: true====I: false
空白字体
B: false====U: false====I: false
只是斜体
B: true====U: false====I: true
斜体划线
B: true====U: true====I: true

解析字符串为document,需要用到Jsoup.jar包

再通过递归一层层解析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: