后台如何解析html


 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包

再通过递归一层层解析。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值