后台如何解析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包
再通过递归一层层解析。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: vue利用v-for嵌套输出多层对象,分别输出到个表
- 下一篇: C# 实现设置系统环境变量设置