当前位置: 首页 > news >正文

做网站广告网页培训方案及培训计划

做网站广告网页,培训方案及培训计划,使用网站效果,炫酷网站设计1 XML解析器对比 1. DOM解析器: ○ 优点:易于使用,提供完整的文档树,可以方便地修改和遍历XML文档。 ○ 缺点:对大型文档消耗内存较多,加载整个文档可能会变慢。 ○ 适用场景:适合小型XML文档…

1 XML解析器对比

1. DOM解析器:

○ 优点:易于使用,提供完整的文档树,可以方便地修改和遍历XML文档。
○ 缺点:对大型文档消耗内存较多,加载整个文档可能会变慢。
○ 适用场景:适合小型XML文档或需要多次访问和修改XML内容的情况。

2. SAX解析器:

○ 优点:逐个处理XML元素,节省内存,适用于一次性遍历大型XML文档。
○ 缺点:编写处理事件的代码可能会相对复杂,不适合需要频繁修改XML内容的情况。
○ 适用场景:适合大型XML文档的读取、分析和提取数据。

3. StAX解析器:

○ 优点:结合了DOM和SAX的优点,提供了灵活的编程模型,适用于流式处理和部分内存加载。
○ 缺点:可能比纯粹的SAX稍微复杂一些。
○ 适用场景:适合需要处理中等大小的XML文档,同时保持较低内存占用的情况。

4. XPath解析器:

○ 优点:提供了强大的查询功能,能够方便地定位XML文档中的元素和数据。
○ 缺点:可能会稍微降低性能,特别是在复杂的查询情况下。
○ 适用场景:适合需要定位和提取特定数据的情况,可以减少手动遍历和解析的工作。

5. JSON对应XML解析器:

○ 优点:可以将XML数据转换为JSON格式,利用JSON解析器处理。
○ 缺点:可能会导致数据结构转换复杂性,不是所有情况下都适用。
○ 适用场景:当您的应用程序使用JSON格式处理数据,但需要处理XML数据时,可以考虑此类解析器。

解析的jacoco XML数据量较多 行数至几十万行 XML大小为 数十M
选择SAX解析器进行解析

2 解析思路

SAX可以逐行处理标签
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/*** @author xieyan* @date 2023-08-22 16:13*/
public class JacocoXmlConstant {public static final String COUNTER = "counter";public static final String METHOD = "method";public static final String CLASS = "class";public static final String SOURCEFILE = "sourcefile";public static final String SOURCEFILE_NAME = "name";public static final String COUNTER_TYPE = "type";public static final String COUNTER_MISSED = "missed";public static final String COUNTER_COVERED = "covered";public static final String METHOD_NAME = "name";public static final String METHOD_DESC = "desc";public static final String CLASS_NAME = "name";public static final String CLASS_SOURCEFILENAME = "sourcefilename";public static final String REPORT_NAME = "name";public static final String PACKAGE_NAME = "name";public static final String REPORT = "report";public static final String PACKAGE = "package";public static final String SESSIONINFO = "sessioninfo";public static final String LINE = "line";public static final String INSTRUCTION_TYPE = "INSTRUCTION";public static final String BRANCH_TYPE = "BRANCH";public static final String LINE_TYPE = "LINE";public static final String COMPLEXITY_TYPE = "COMPLEXITY";public static final String METHOD_TYPE = "METHOD";public static final String CLASS_TYPE = "CLASS";}import lombok.Getter;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;import java.util.List;import static com.jacoco.xml.JacocoXmlConstant.*;/*** 解析xml文件** @author xieyan*/
@Getter
public class ParseXmlHandler extends DefaultHandler {private Report report;private Package currentPackage;private Clazz currentClass;private Method currentMethod;private Counter currentCounter;private String sourcefile;/*** 开始解析元素时触发*/@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) {switch (qName) {// 跳过 sessioninfo 和 linecase SESSIONINFO:case LINE:return;// 解析reportcase REPORT:report = new Report();report.setName(attributes.getValue(REPORT_NAME));break;// 解析packagecase PACKAGE:currentPackage = new Package();currentPackage.setName(attributes.getValue(PACKAGE_NAME));if (report != null) {report.addPackage(currentPackage);}break;// 解析classcase CLASS:currentClass = new Clazz();currentClass.setName(attributes.getValue(CLASS_NAME));currentClass.setSourcefilename(attributes.getValue(CLASS_SOURCEFILENAME));if (currentPackage != null) {currentPackage.addClass(currentClass);}break;// 解析methodcase METHOD:currentMethod = new Method();currentMethod.setName(attributes.getValue(METHOD_NAME));currentMethod.setDesc(attributes.getValue(METHOD_DESC));if (currentClass != null) {currentClass.addMethod(currentMethod);}break;// 解析sourcefilecase SOURCEFILE:sourcefile = attributes.getValue(SOURCEFILE_NAME);break;// 解析countercase COUNTER:currentCounter = new Counter();currentCounter.setType(attributes.getValue(COUNTER_TYPE));currentCounter.setMissed(Integer.parseInt(attributes.getValue(COUNTER_MISSED)));currentCounter.setCovered(Integer.parseInt(attributes.getValue(COUNTER_COVERED)));// 绑定counter 到对应的元素bindCounter();break;default:break;}}/*** 结束解析元素时触发*/@Overridepublic void endElement(String uri, String localName, String qName) {switch (qName) {case SESSIONINFO:case LINE:// 跳过 sessioninfo 和 linereturn;case SOURCEFILE:// 避免重复加入 counter 到 pagesourcefile = null;break;case REPORT:// 计算总的覆盖率Coverage coverageReport = caculateCoverage(report.getReportCounters());report.setReportCoverage(coverageReport);break;case PACKAGE:// 计算 package 覆盖率if (currentPackage != null) {Coverage coveragePackage = caculateCoverage(currentPackage.getPackageCounters());currentPackage.setPackageCoverage(coveragePackage);currentPackage = null;}break;case CLASS:// 计算 class 覆盖率if (currentClass != null) {Coverage coverageClass = caculateCoverage(currentClass.getClazzCounters());currentClass.setClazzCoverage(coverageClass);currentClass = null;}break;case METHOD:// 计算 method 覆盖率if (currentMethod != null) {Coverage coverageMethod = caculateCoverage(currentMethod.getMethodCounters());currentMethod.setMethodCoverage(coverageMethod);currentMethod = null;}break;case COUNTER:currentCounter = null;break;default:break;}}/*** 绑定counter 到对应的元素*/private void bindCounter() {// counter 属于 methodif (currentMethod != null) {currentMethod.addCounter(currentCounter);}// counter 属于 classelse if (currentClass != null) {currentClass.addCounter(currentCounter);}// counter 属于 packageelse if (currentPackage != null) {// 跳过sourcefile里的counter 避免重复加入if (sourcefile == null) {currentPackage.addCounter(currentCounter);}}// counter 属于 reportelse if (report != null) {report.addCounter(currentCounter);}}/*** 计算覆盖率*/private Coverage caculateCoverage(List<Counter> counterList) {Coverage result = new Coverage();for (Counter counter : counterList) {String type = counter.getType().toUpperCase();String coverage = processResult(counter);setCoverageByType(result, type, coverage);}return result;}private void setCoverageByType(Coverage result, String type, String coverage) {switch (type) {// 指令覆盖率case INSTRUCTION_TYPE:result.setInstructionCoverage(coverage);break;// 行覆盖率case LINE_TYPE:result.setLineCoverage(coverage);break;// 分支覆盖率case BRANCH_TYPE:result.setBranchCoverage(coverage);break;// 圈复杂度覆盖率case COMPLEXITY_TYPE:result.setComplexityCoverage(coverage);break;// 方法覆盖率case METHOD_TYPE:result.setMethodCoverage(coverage);break;// 类覆盖率case CLASS_TYPE:result.setClassCoverage(coverage);break;default:break;}}/*** 处理覆盖率结果* 保留两位小数 例如 99.99%*/private String processResult(Counter counter) {int missed = counter.getMissed();int covered = counter.getCovered();double coverage = (double) covered / (missed + covered);double coveragePercentage = coverage * 100;return String.format("%.2f%%", coveragePercentage);}}import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author xieyan*/
@Data
public class Clazz {private String name;private String sourcefilename;private final List<Method> methods = new ArrayList<>();private final List<Counter> clazzCounters = new ArrayList<>();private Coverage clazzCoverage;public void addMethod(Method method) {methods.add(method);}public void addCounter(Counter counter) {clazzCounters.add(counter);}}import lombok.Data;/*** @author xieyan*/
@Data
public class Counter {private String type;private int missed;private int covered;}import lombok.Data;/*** 覆盖率统计* @author xieyan* @date 2021-08-22 16:13*/
@Data
public class Coverage {/*** 指令覆盖率*/private String instructionCoverage;/** * 分支覆盖率*/private String branchCoverage;/*** 行覆盖率*/private String lineCoverage;/*** 圈复杂度覆盖率*/private String complexityCoverage;/*** 方法覆盖率 */private String methodCoverage;/*** 类覆盖率*/private String classCoverage;
}Method
import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author xieyan*/
@Data
public class Method {private String name;private String desc;private final List<Counter> methodCounters = new ArrayList<>();private Coverage methodCoverage;public void addCounter(Counter counter) {methodCounters.add(counter);}}import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author xieyan*/
@Data
public class Package {private String name;private final List<Clazz> classes = new ArrayList<>();private final List<Counter> packageCounters = new ArrayList<>();private Coverage packageCoverage;public void addClass(Clazz clazz) {classes.add(clazz);}public void addCounter(Counter counter) {packageCounters.add(counter);}}@Data
public class Report {private String name;private final List<Package> packages = new ArrayList<>();private final List<Counter> reportCounters = new ArrayList<>();private Coverage reportCoverage;public void addPackage(Package pkg) {packages.add(pkg);}public void addCounter(Counter counter) {reportCounters.add(counter);}}import lombok.extern.slf4j.Slf4j;
import org.xml.sax.SAXException;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 解析jacoco覆盖率报告工具类* @author xieyan* @date 2023-08-22 16:38*/
@Slf4j
public class ParseJacocoXmlUtil {/*** 解析jacoco覆盖率报告** @param xmlPath jacoco覆盖率报告路径* @return 解析后的报告对象,解析失败时返回null*/public static Report parse(String xmlPath) {try {SAXParserFactory factory = SAXParserFactory.newInstance();// 禁用DTD验证factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);SAXParser saxParser = factory.newSAXParser();// 读取xml文件File xmlFile = new File(xmlPath);ParseXmlHandler handler = new ParseXmlHandler();try (InputStream inputStream = xmlFile.toURI().toURL().openStream()) {// 解析XML文件saxParser.parse(inputStream, handler);return handler.getReport();}} catch (ParserConfigurationException | SAXException | IOException e) {log.error("解析jacoco xml 覆盖率报告失败", e);}return null;}
}public class SaxParsingToJavaObjectExample {public static void main(String[] args) {// 指定XML文件路径String xmlFilePath = "D:\\tmp\\jacoco.xml";//String xmlFilePath = "F:\\temp\\a.xml";Report report = ParseJacocoXmlUtil.parse(xmlFilePath);Optional.ofNullable(report).ifPresent(SaxParsingToJavaObjectExample::export);}public static void export(Report report) {for (Package pkg : report.getPackages()) {System.out.println("Package Name: " + pkg.getName());for (Clazz clazz : pkg.getClasses()) {System.out.println("Class Name: " + clazz.getName());for (Method method : clazz.getMethods()) {System.out.println("Method Name: " + method.getName());System.out.println("Method Description: " + method.getDesc());for (Counter counter : method.getMethodCounters()) {System.out.println("Counter Type: " + counter.getType());System.out.println("Counter Missed: " + counter.getMissed());System.out.println("Counter Covered: " + counter.getCovered() + "\n");}System.out.println("==================== Method ==========================================");}}}}
}

文章转载自:
http://cutinization.qrqg.cn
http://tellurion.qrqg.cn
http://penetrameter.qrqg.cn
http://postmastership.qrqg.cn
http://anode.qrqg.cn
http://arquebusier.qrqg.cn
http://postface.qrqg.cn
http://quadroon.qrqg.cn
http://candidature.qrqg.cn
http://malathion.qrqg.cn
http://extortionist.qrqg.cn
http://microsleep.qrqg.cn
http://gymnastic.qrqg.cn
http://habitmaker.qrqg.cn
http://homogeny.qrqg.cn
http://hospitalisation.qrqg.cn
http://ispy.qrqg.cn
http://andalusia.qrqg.cn
http://bruxelles.qrqg.cn
http://cathomycin.qrqg.cn
http://perverted.qrqg.cn
http://wa.qrqg.cn
http://phagophobia.qrqg.cn
http://bowhead.qrqg.cn
http://dino.qrqg.cn
http://nancified.qrqg.cn
http://prepublication.qrqg.cn
http://cuisine.qrqg.cn
http://mcluhanesque.qrqg.cn
http://euphorbiaceous.qrqg.cn
http://compile.qrqg.cn
http://beckoningly.qrqg.cn
http://imprudence.qrqg.cn
http://jinriksha.qrqg.cn
http://calcination.qrqg.cn
http://standaway.qrqg.cn
http://remiform.qrqg.cn
http://syllabary.qrqg.cn
http://titivate.qrqg.cn
http://wraaf.qrqg.cn
http://impicture.qrqg.cn
http://graze.qrqg.cn
http://intuc.qrqg.cn
http://chronical.qrqg.cn
http://valence.qrqg.cn
http://ketene.qrqg.cn
http://lodge.qrqg.cn
http://quicksanded.qrqg.cn
http://fungistasis.qrqg.cn
http://uninventive.qrqg.cn
http://frankfurter.qrqg.cn
http://landgrave.qrqg.cn
http://simoom.qrqg.cn
http://gutturonasal.qrqg.cn
http://binocle.qrqg.cn
http://inferno.qrqg.cn
http://dirigible.qrqg.cn
http://piggyback.qrqg.cn
http://porphobilinogen.qrqg.cn
http://malabsorption.qrqg.cn
http://antiquarianize.qrqg.cn
http://monteverdian.qrqg.cn
http://crispation.qrqg.cn
http://seaware.qrqg.cn
http://tuboid.qrqg.cn
http://lunule.qrqg.cn
http://dichasium.qrqg.cn
http://daytale.qrqg.cn
http://druse.qrqg.cn
http://valueless.qrqg.cn
http://transsexualist.qrqg.cn
http://hollandia.qrqg.cn
http://diesohol.qrqg.cn
http://pacifically.qrqg.cn
http://gigaton.qrqg.cn
http://travel.qrqg.cn
http://indeterminable.qrqg.cn
http://holophrase.qrqg.cn
http://adrenocorticotro.qrqg.cn
http://fustigation.qrqg.cn
http://krait.qrqg.cn
http://cavetto.qrqg.cn
http://sienese.qrqg.cn
http://cacique.qrqg.cn
http://litterbug.qrqg.cn
http://chartreuse.qrqg.cn
http://gironde.qrqg.cn
http://dialytic.qrqg.cn
http://microtransmitter.qrqg.cn
http://coprophobia.qrqg.cn
http://fibrescope.qrqg.cn
http://forefront.qrqg.cn
http://giantism.qrqg.cn
http://judicious.qrqg.cn
http://burliness.qrqg.cn
http://stall.qrqg.cn
http://jacket.qrqg.cn
http://predictability.qrqg.cn
http://verbify.qrqg.cn
http://skinhead.qrqg.cn
http://www.dt0577.cn/news/78321.html

相关文章:

  • 珠海响应式网站建设推广公司百度网盘客服电话人工服务
  • 中软国际软件培训怎么样免费的seo优化
  • 百度seo网站优化 网络服务最近10个新闻
  • 公司网站建设费会计处理品牌策划方案模板
  • 无锡新区网站制作百度问问首页
  • wordpress 自定义分类idseo入门讲解
  • 模块式网站制作seo是什么缩写
  • 杭州富阳网站建设公司百度seo
  • 莒县做网站和微信国际时事新闻最新消息
  • 汕尾海丰建设规划局网站小网站搜什么关键词好
  • 常州市建设银行网站seo网站优化课程
  • 东莞网站竞价推广运营河南百度seo
  • 织梦做招聘网站电商平台推广方式有哪些
  • 做网站代理需要办什么营业执照滕州网站建设优化
  • 接设计私单的平台百度蜘蛛池自动收录seo
  • 网站建设优化排名在百度怎么发布作品
  • 免费网站推广在线观看百度手机助手免费下载
  • 网站权重收录联合早报 即时消息
  • 那些网站做批发seo内容优化是什么意思
  • 自己怎么做优惠券网站深圳专业seo外包
  • 电子销售网站模板免费下载西安关键词排名软件
  • 建站网站教程网络服务器图片
  • 网站建设后台管理流程广州疫情已经达峰
  • 购物网站平台建设友情链接怎么设置
  • 做农业网站怎么赚钱龙岗网站建设
  • 小型的游戏网站怎么做网站搜索排名靠前
  • 网站开发过程中出现的问题做网站设计哪里有
  • 做淘宝客网站的流程百度搜索引擎优化的推广计划
  • 在线播放 WordPress上海seo优化公司 kinglink
  • 网站建设和网站美国今天刚刚发生的新闻