- 浏览: 390188 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
zenmshuo:
这个也是调用Excel IO实现的吗?之前都是通过Spread ...
JS 导入导出 EXcel -
todayANDtommorow:
太喜欢了,谢谢
HSSFWorkBooK用法 -
qinjian379:
挺实用的。
HSSFWorkBooK用法 -
s_8808:
var isMobile=/^(?:13\d|15\d)\d{ ...
正则表达式判断电话号码 -
liuweihug:
jquery调用函数时传递对象参数 http://www.s ...
Jquery 迭代对象
最近在做快捷支付这块,对XML这块接触的比较多.梳理XML这块的时候, 突然发现 Digester 对不管是 字符串的 XML 还是 XML文件都能很好的解析..不足点就是引用的 apache的东西有点多. (apache的东西 耦合性太高.....)不过确实好用..
首先是 import
import org.apache.commons.digester.Digester; import org.apache.commons.digester.RuleSetBase; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; import java.io.InputStream;
这几个是主要的..至于还有其他的可以自己再加入.
一 : 然后是主方法(分两个,一个是 文件. 一个是 string字符串)
1:首先看 读取文件的主方法, 一些解释的话 可以上这个地址
http://onjava.com/pub/a/onjava/2002/10/23/digester.html?page=2 查看
public static void testXML1() throws ParseException{ File inputStream = new File("c:/jack/test.xml"); Digester configDigester = new Digester(); configDigester.setNamespaceAware(true); configDigester.setValidating(false); configDigester.setUseContextClassLoader(true); //load rule set configDigester.addRuleSet(new PaymentStatusCheckResponseRuleSet()); OrderCheckResponseConfig datas = new OrderCheckResponseConfig(); configDigester.push(datas); try { configDigester.parse(inputStream); } catch (IOException e) { e.printStackTrace(); throw new ParseException(e); } catch (SAXException e) { e.printStackTrace(); throw new ParseException(e); } Map responseProp = new HashMap(); responseProp.put("status", datas.getStatus()); responseProp.put("statusText", datas.getStatusText()); responseProp.put("msgCode", datas.getMsgCode()); responseProp.put("msgCn", datas.getMsgCn()); responseProp.put("orderDate", datas.getOrderDate()); responseProp.put("orderTime", datas.getOrderTime()); responseProp.put("orderNo", datas.getOrderNo()); responseProp.put("orderAmt", datas.getOrderAmt()); responseProp.put("currId", datas.getCurrId()); responseProp.put("payAmt", datas.getPayAmt()); responseProp.put("memo", datas.getMemo()); responseProp.put("payNo", datas.getPayNo()); responseProp.put("hostDate", datas.getHostDate()); responseProp.put("accNo", datas.getAccNo()); responseProp.put("hoistTime", datas.getHoistTime()); responseProp.put("accType", datas.getAccType()); responseProp.put("pbCstName", datas.getPbCstName()); System.out.println(responseProp); }
addRuleSet , 可以写一个内部的 RuleSet 类,主要是用来读取XML的节点信息和内容的
/** * Inner class for StatusCheckResponse ruleset */ class PaymentStatusCheckResponseRuleSet extends RuleSetBase{ public void addRuleInstances(Digester digester) { digester.addCallMethod("stream/status", "setStatus", 1); digester.addCallParam("stream/status", 0); digester.addCallMethod("stream/statusText", "setStatusText", 1); digester.addCallParam("stream/statusText", 0); digester.addCallMethod("stream/msgCode", "setMsgCode", 1); digester.addCallParam("stream/msgCode", 0); digester.addCallMethod("stream/msgCn", "setMsgCn", 1); digester.addCallParam("stream/msgCn", 0); digester.addCallMethod("stream/orderDate", "setOrderDate", 1); digester.addCallParam("stream/orderDate", 0); digester.addCallMethod("stream/orderTime", "setOrderTime", 1); digester.addCallParam("stream/orderTime", 0); digester.addCallMethod("stream/orderNo", "setOrderNo", 1); digester.addCallParam("stream/orderNo", 0); digester.addCallMethod("stream/orderAmt", "setOrderAmt", 1); digester.addCallParam("stream/orderAmt", 0); digester.addCallMethod("stream/currId", "setCurrId", 1); digester.addCallParam("stream/currId", 0); digester.addCallMethod("stream/payAmt", "setPayAmt", 1); digester.addCallParam("stream/payAmt", 0); digester.addCallMethod("stream/memo", "setMemo", 1); digester.addCallParam("stream/memo", 0); digester.addCallMethod("stream/payNo", "setPayNo", 1); digester.addCallParam("stream/payNo", 0); digester.addCallMethod("stream/hostDate", "setHostDate", 1); digester.addCallParam("stream/hostDate", 0); digester.addCallMethod("stream/hoistTime", "setHoistTime", 1); digester.addCallParam("stream/hoistTime", 0); digester.addCallMethod("stream/accNo", "setAccNo", 1); digester.addCallParam("stream/accNo", 0); digester.addCallMethod("stream/accType", "setAccType", 1); digester.addCallParam("stream/accType", 0); digester.addCallMethod("stream/pbCstName", "setPbCstName", 1); digester.addCallParam("stream/pbCstName", 0); } }
最后就是一个实体的接受类 Digester会push数据进来的(省了 get set 方法)
public class OrderCheckResponseConfig { private String status; //该笔直联查询交易的状态 private String statusText;//该笔直联查询交易状态的说明 private String msgCode; //交易状态 private String msgCn; //交易状态信息 private String orderDate;//订单日期 private String orderTime;//订单时间 private String orderNo; //订单号 private String orderAmt;//订单金额 private String currId; //支付币种 private String payAmt; //支付金额 private String memo; //摘要信息 private String payNo; //支付交易流水号 private String hostDate;//主机操作日期 private String hoistTime;//主机操作时间 private String accNo; //支付卡号 private String accType; //卡号类型 private String pbCstName;//个人消费者中文姓名
这个 的 XML 比较简单 如下图所示.没有什么复杂的节点.
<?xml version="1.0" encoding="GBK"?> <stream> <status>1</status><!--该笔直联查询交易的状态char(7) --> <statusText>2</statusText><!--该笔直联查询交易状态的说明varchar(254) --> <msgCode>交易状态</msgCode><!--该笔订单的交易状态char(7)--> <msgCn>交易状态信息</msgCn><!--该笔订单的交易状态的说明varchar(254)--> <orderDate>订单日期</orderDate><!--订单日期格式YYYYMMDD--> <orderTime>订单时间</orderTime><!--订单时间格式HHmmss--> <orderNo>订单号</orderNo><!--char(20)--> <orderAmt>订单金额</orderAmt><!--decimal(15,2)--> <currId>支付币种</currId><!--char(3)--> <payAmt>支付金额</payAmt><!--decimal(15,2)--> <memo>摘要信息</memo><!--char(22)--> <payNo>支付交易流水号</payNo><!--char(20)--> <hostDate>主机操作日期</hostDate><!--日期格式YYYYMMDD--> <hoistTime>主机操作时间</hoistTime><!--时间格式HHmmss--> <accNo>支付卡号</accNo><!--char(19)--> <accType>卡号类型</accType><!--char(2) 02 信用卡 01 借记卡--> <pbCstName>个人消费者中文姓名</pbCstName><!--varchar(42)--> </stream>
2:如果是字符串形式的话. 方法如下 (删除了一些, 还需要转变编码格式)
public static void testXML2() throws ParseException{ String text = "<?xml version=\"1.0\" encoding=\"GBK\"?><stream><status>交易状态</status><!--交易状态 char(7)--><statusText>交易状态信息</statusText><!--交易状态信息 varchar(254)--><batNo></batNo>批次号<!--批次号 varchar(8)--><sucTotalNum>银行受理成功总笔数</sucTotalNum><!--银行受理成功总笔数 int--><sucTotalAmt>银行受理成功总金额</sucTotalAmt><!--银行受理成功总金额 decimal(15,2)--><errTotalNum>银行受理失败总笔数</errTotalNum><!--银行受理失败总笔数int--><errTotalAmt>银行受理失败总金额</errTotalAmt><!--银行受理失败总金额 decimal(15,2)-->" + "<list name=\"userDataList\"><row><cancelFlwNo>商户充值退回流水号</cancelFlwNo><!--商户充值退回流水号varchar(20) --><status>liststatus</status><!--交易银行受理状态char(7)--><statusText>liststatusText</statusText><!--交易银行受理状态信息 varchar(254)--></row></list></stream>"; System.out.println(text); InputStream inputStream=new ByteArrayInputStream(text..getBytes("gb2312"));//指定编码格式防止乱码 //File inputStream = new File("c:/jack/refund.xml"); Digester configDigester = new Digester(); configDigester.setNamespaceAware(true); configDigester.setValidating(false); configDigester.setUseContextClassLoader(true); //load rule set configDigester.addRuleSet(new CNCBRefundRuleset()); CNCBRefundConfig datas = new CNCBRefundConfig(); configDigester.push(datas); try { configDigester.parse(inputStream); } catch (IOException e) { e.printStackTrace(); throw new ParseException(e); } catch (SAXException e) { e.printStackTrace(); throw new ParseException(e); } Map responseProp = new HashMap(); responseProp.put("status", datas.getStatus()); responseProp.put("statusText", datas.getStatusText()); responseProp.put("batNo", datas.getStatus()); responseProp.put("sucTotalNum", datas.getSucTotalNum()); responseProp.put("sucTotalAmt", datas.getSucTotalAmt()); responseProp.put("errTotalNum", datas.getErrTotalNum()); responseProp.put("errTotalAmt", datas.getErrTotalAmt()); responseProp.put("cancelFlwNo", datas.getCancelFlwNo()); responseProp.put("liststatus", datas.getListsStatus()); responseProp.put("liststatusText", datas.getListstatusText()); System.out.println(responseProp); }
设置RuleSet ,写一个内部类
class CNCBRefundRuleset extends RuleSetBase{ @Override public void addRuleInstances(Digester digester) { // TODO Auto-generated method stub digester.addCallMethod("stream/status", "setStatus", 1); digester.addCallParam("stream/status", 0); digester.addCallMethod("stream/statusText", "setStatusText", 1); digester.addCallParam("stream/statusText", 0); digester.addCallMethod("stream/sucTotalAmt", "setSucTotalAmt", 1); digester.addCallParam("stream/sucTotalAmt", 0); digester.addCallMethod("stream/sucTotalNum", "setSucTotalNum", 1); digester.addCallParam("stream/sucTotalNum", 0); digester.addCallMethod("stream/errTotalNum", "setErrTotalNum", 1); digester.addCallParam("stream/errTotalNum", 0); digester.addCallMethod("stream/errTotalAmt", "setErrTotalAmt", 1); digester.addCallParam("stream/errTotalAmt", 0); digester.addCallMethod("stream/list/row/cancelFlwNo", "setCancelFlwNo", 1); //这里的 list 也可以用name 来表示.结果是一样的 digester.addCallParam("stream/list/row/cancelFlwNo", 0); digester.addCallMethod("stream/list/row/status", "setListsStatus", 1);//以后不管子节点有多少,从最开始往下取,这样就很方便的解析了. digester.addCallParam("stream/list/row/status", 0); digester.addCallMethod("stream/list/row/statusText", "setListstatusText", 1); digester.addCallParam("stream/list/row/statusText", 0); } }
实体bean
class CNCBRefundConfig{ private String status; private String statusText; private String batNo; private String sucTotalNum; private String sucTotalAmt; private String errTotalNum; private String errTotalAmt; private String cancelFlwNo; private String listsStatus; //如果有重名的,则可以加上list 这个 父节点,区别. 这个就解决了子节点太难读的缺点,可以按照节点路径取值. private String liststatusText;
这个是 XML的 文件形式的. 上面字符串的删除了一些东西. 这个是完整的
<?xml version="1.0" encoding="GBK"?> <stream> <status>交易状态</status><!--交易状态 char(7)--> <statusText>交易状态信息</statusText><!--交易状态信息 varchar(254)--> <batNo></batNo>批次号<!--批次号 varchar(8)--> <sucTotalNum>银行受理成功总笔数</sucTotalNum><!--银行受理成功总笔数 int--> <sucTotalAmt>银行受理成功总金额</sucTotalAmt><!--银行受理成功总金额 decimal(15,2)--> <errTotalNum>银行受理失败总笔数</errTotalNum><!--银行受理失败总笔数int--> <errTotalAmt>银行受理失败总金额</errTotalAmt><!--银行受理失败总金额 decimal(15,2)--> <list name="userDataList"> <row> <cancelFlwNo>商户充值退回流水号</cancelFlwNo><!--商户充值退回流水号varchar(20) --> <status>liststatus</status><!--交易银行受理状态char(7)--> <statusText>liststatusText</statusText><!--交易银行受理状态信息 varchar(254)--> </row> </list> </stream>
这里面在整理的时候, 不是很方便整理. 而且还去掉了银行的缩写. 如有需要. 到时候再看有心情整理否.
------------------------------------------------------追加-----------------------
追加一点如果是 XML中的字段含有属性, 想获取属性值.原理差不多. 只是调用的方法不一样.
<?xml version="1.0" encoding="GB2312"?> <items version="2.00" > <result name="status" value="0'/> </items>
想要获取name 或者是 value的值.
digester.addSetProperties("items/result", "value", "resultStatus");
在ruleset 里面 用这个就好了. 其中 resultStatus 是接受bean里面的一个属性.
--------------------------------------------------------继续追加----------------------------------------
如果是是下面这种格式的XML
<?xml version="1.0" encoding="UTF-8"?> <web> <root name = "root_name1"> <bar id="0" title="The Zero Child"/> <bar id="123" title="The First Child"/> <bar id="456" title="The Second Child"/> </root> <root name = "root_name2"> <bar id="789" title="Another Child"/> </root> </web>
则可以用更简单的编码格式.
RuleSetBase
public class ConfigRuleSet extends RuleSetBase{ //注意,需要继承RuleSetBase public void addRuleInstances(Digester digester){ digester.setValidating( false ); digester.addObjectCreate("web", WebConfig.class) ; digester.addSetProperties("web"); digester.addObjectCreate( "web/root", Root.class ); digester.addSetProperties("web/root"); digester.addSetNext( "web/root", "addRoot" ); digester.addObjectCreate( "web/root/bar", Bar.class ); digester.addSetProperties("web/root/bar"); digester.addSetNext( "web/root/bar", "addBar" ); } }
编译解析XML
final String fileName = "/card/bean/Item.xml" ; Items items = new Items() ; Digester digester = new Digester() ; ConfigRuleSet rule = new ConfigRuleSet(); rule.addRuleInstances(digester) ; try { items = (Items)digester.parse(new File(fileName)) ; System.out.println("items size :" + items.getSize()) ; System.out.println("items getResult :"+items.getResult()); Item[] item = items.getItemMap() ; for (int i = 0; i < item.length; i++) { System.out.println("item type:" + item[i].getType()) ; Param[] param = item[i].getParams() ; for (int j = 0; j < param.length; j++) { if(j>0) System.out.println("/t------------------"); System.out.println("/param name:" + param[j].getName()) ; System.out.println("/param value:" + param[j].getValue()) ; } } } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); }
然后是各个 bean 之间的关系, 这里就不整理了.
这里摘自 :http://blog.csdn.net/gooing/article/details/381399
发表评论
-
struts2 深入探索
2012-02-08 15:55 1724Struts2中一些零碎的知识点:struts.xml详解、模 ... -
tomcat 启动两次, servlet 初始化两次
2012-02-07 13:52 1604今天有同事碰到了 servlet 的init方法 ... -
java 属性文件读取工具类
2012-02-07 10:30 1216哎 . 年纪大了就越来越懒了... 不废话,直接代码 ... -
HSSFWorkBooK用法
2012-02-02 14:45 109313public ActionResult excel ... -
httpclient 的相关应用
2011-07-21 17:29 23891这个主要是 httpclient4.0.3 的一些常用 ... -
JDBC 取一个结果集得简单处理方法
2011-07-15 15:38 19881:首先可以看下SQL语句 select task.t ... -
判断Socket 服务端是否已关闭
2011-03-28 16:07 2701最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连 ... -
Ibatis 调用存储过程 返回值为空 求真相
2011-01-20 11:01 21331: 首先看存储过程语句(我是用Navicat 8) CR ... -
Java基础-关于session的详细解释
2010-11-18 16:44 1222一、术语session 在我的经验里,session这个词 ... -
java中如何实现同一账号不能同时登录
2010-11-18 14:44 20416经过两天的研究,下面给两个方法.不个是webwork版 ... -
Java基础:里设置session过期时间
2010-11-18 09:42 7057由于session值之前没有设置,以至于刚登录的网站,不 ... -
webwork Action中获取request, response,session对象的方法
2010-11-17 16:52 1730webwork Action中获取request, ... -
webwork 获得 request,session
2010-11-15 17:33 917ServletActionContext.getRequ ... -
ActionContext.getContext().getSession() 的意义
2010-11-12 10:16 70981: ActionContext.getContext ... -
java Web 同一个用户名不能同时登陆的思路
2010-11-12 08:55 6016情况之一:第一个用户等陆了,不允许第二个用户登录。 ... -
JSP 访问数据库
2010-10-09 14:48 15341:导入 Java类 <%@ page lan ... -
小知识
2010-08-12 10:28 8681:纯粹就是给自己长记性 <script typ ... -
Java中的时间操作(判断工作日和休息日)和判断日期大小
2010-07-08 14:43 13006--1:日期操作以免自己 ... -
webwork 文件上传
2010-06-08 15:40 1188--1:先看属性 private ... -
java 导出 TXT,CSV
2010-05-06 11:07 5326导出这两个就比导出EXCel简单多了,主要是不用考虑一个一个 ...
相关推荐
JESD79-2F DDR2 JESD79-3F DDR3 JESD79-4D DDR4 JESD79-5C DDR5 JESD209-2F LPDDR2 JESD209-3C LPDDR3 JESD209-4E LPDDR4 JESD209-4-1A LPDDR4X JESD209-5C LPDDR5(X)
COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,COMSOL二维光子晶体角态研究:单胞与超胞能带计算及边界态与角态特性分析,comsol二维光子晶体角态。 单胞能带,超胞能带,边界态以及角态计算。 ,comsol;二维光子晶体;角态;单胞能带;超胞能带;边界态计算,基于Comsol的二维光子晶体角态及能带边界计算研究
六自由度机械臂抓取动作仿真与代码解析:抓取动画、关节参数变化及轨迹图解详解,六自由度机械臂抓取动作仿真指南:掌握两套代码实现动画与轨迹图模拟学习攻略,六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码,包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手~ ,六自由度机械臂;抓取动作仿真;抓取动画;关节角变化;角速度角加速度;抓取轨迹图;两套代码;简单易懂好上手,六自由度机械臂抓取动作仿真演示:代码与轨迹图解
ITC网络广播工具软件
Multisim四位密码锁电路仿真设计:设定、开锁与声光报警功能演示资料包,Multisim四位密码锁电路仿真设计:设定、输入、开锁与报警功能详解,附源文件、原理说明书与演示视频,multisim四位密码锁电路仿真设计 功能: 1.通过拨码开关1进行初始密码设定。 2.通过拨码开关2输入密码,实现开锁判断。 3.如果密码正确,LED绿灯亮,表示开锁。 4.如果密码不正确,LED红灯亮,蜂鸣器鸣叫,声光报警。 资料包含:仿真源文件+原理说明书+演示视频 ,四位密码锁电路、Multisim仿真设计、初始密码设定;拨码开关输入;开锁判断;LED灯显示;声光报警;仿真源文件;原理说明书;演示视频,Multisim四位密码锁电路仿真设计:初始密码设置与智能解锁功能的声光报警展示
俗话说,摸鱼摸的好,上班没烦恼,毕竟谁能拒绝带薪拉屎呢(手动狗头) 这是一个云开发职场打工人专属上班摸鱼划水微信小程序源码,没有后台 直接导入微信开发者工具即可运行,UI简约大气漂亮,只需登录微信公众平台配置完合法域名即可轻松上线。 用户进入摸鱼小程序,可以自由设置薪资,上班时间、下班时间、发薪日、 月工作天数以提醒自己摸鱼,全民打酱油,让自己成为摸鱼冠军,《商鞅摸鱼哲学》 摸鱼不是自我放纵,而是个人实力的积蓄,我们的小目标是晚睡晚起 小程序中的今日待办会提醒用户带薪拉屎和闲逛,下方展示的是距离休息日的天数,距离下一次发工资的天数和节日的天数。
【毕业设计】基于Java的开发的一个集合校园二手交易、拼车、失物招领等功能的app_pgj
个人记录:PICkit3离线烧录流程 使用软件:MPLAB X IDE v5.30 记录时间:20250215
基于Matlab代码的电力系统状态估计与实验仿真研究:扩展卡尔曼滤波和无迹卡尔曼滤波在电力系统动态状态估计中的应用及效果分析,Matlab仿真实验研究:基于扩展卡尔曼滤波器与无迹卡尔曼滤波器对电力系统状态估计的影响及验证,状态估计 电力系统状态估计 Matlab代码 实验仿真研究 电力系统由于测量值和传输误差,还有测量噪声的影响,会对状态估计产生影响。 因此,需要对嘈杂的测量进行滤波,以获得准确的电力系统运行动态。 本文使用扩展卡尔曼滤波器(EKF)和无迹卡尔曼滤波器(UKF)来估计电力系统的动态状态。 扩展卡尔曼滤波EKF、无迹卡尔曼滤波UKF 利用扩展的无迹卡尔曼滤波器估计了动力系统的动态状态。 对WECC 3机9总线系统和新英格兰10机39总线系统进行了案例研究。 结果表明EKF和UKF都能准确地估计电力系统的动态状态。 ,核心关键词:状态估计; 电力系统状态估计; Matlab代码; 实验仿真; 测量值误差; 测量噪声; 扩展卡尔曼滤波器(EKF); 无迹卡尔曼滤波器(UKF); 动力系统; 动态状态估计; WECC 3机9总线系统; 新英格兰10机39总线系统。,Matlab
springboot在线考试--
台达DVP EH3与MS300 PLC&变频器通讯程序的全面解决方案,台达DVP EH3与MS300通讯程序:稳定可靠的频率控制与启停管理系统,台达DVP EH3与台达MS300通讯程序(TDEH-9) 可直接用于实际的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等。 程序采用轮询,可靠稳定 器件:台达DVP EH3系列PLC,台达MS300系列变频器,昆仑通态7022Ni 功能:实现频率设定,启停控制,实际频率读取,加减速时间设定。 资料:带注释程序,触摸屏程序,接线和设置说明,后续有技术咨询。 ,核心关键词:台达DVP EH3; 台达MS300; 通讯程序(TDEH-9); 轮询; 稳定; 频率设定; 启停控制; 实际频率读取; 加减速时间设定; 触摸屏程序; 接线方式; 设置说明; 技术咨询。,台达PLC与变频器通讯程序(带注释、触摸屏控制)
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 个人账户管理:支持用户注册、登录与个人信息编辑;提供密码找回及账号安全保护措施。 声纹采集:利用麦克风设备录制用户的声纹样本;支持多种录音格式和质量调整,确保采集到清晰、准确的声纹数据。 声纹模板库管理:建立和维护一个安全的声纹模板库;支持声纹模板的添加、删除、更新和查询操作。 声纹比对与识别:运用深度学习算法对输入的声纹数据进行特征提取和匹配;实现快速、准确的声纹身份验证。 多场景应用支持:适用于多种场景,如门禁系统、移动支付、远程登录等;可根据实际需求定制开发相应的应用场景。 实时监控与报警:实时监控系统运行状态,包括声纹识别成功率、处理速度等指标;当出现异常情况时,及时发出报警信息。 数据分析与报告生成:收集并分析声纹识别过程中的数据,如识别准确率、处理时间等;根据用户需求输出包含详细图表说明的专业级文档供下载打印保存。 社区互动交流:设立论坛版块鼓励用户分享心得体会讨论热点话题;定期邀请行业专家举办线上讲座传授实用技巧知识。 音乐筛选与推荐:集成音乐平台API,根据用户的浏览习惯和情绪状态推荐背景音乐,增强用户体验。 数据可视化:提供交互式的数据可视化面板,使非技术用户也能轻松理解复杂的数据集,从而做出更明智的决策。
三相与多相开绕组永磁同步电机仿真模型的先进控制策略探讨与实现,三相与多相开绕组永磁同步电机的Simulink仿真模型与先进控制策略研究,开绕组电机,开绕组永磁同步电机仿真模型、simulink仿真 共直流母线、独立直流母线,两相容错,三相容错控制,零序电流抑制,控制策略很多 三相开绕组永磁同步电机,六相开绕组永磁同步电机 五相开绕组永磁同步电机,五相开绕组电机 ,开绕组电机; 永磁同步电机仿真模型; simulink仿真; 共直流母线; 独立直流母线; 两相容错; 三相容错控制; 零序电流抑制; 控制策略; 六相开绕组永磁同步电机; 五相开绕组永磁同步电机,开绕组电机仿真研究:共直流母线与独立直流母线的容错控制策略
【毕业设计】基于Java的开发的网上汽车租赁管理系统_pgj
csv 模块是 Python 的标准库,无需额外安装。 运行结果如下图: ['姓名', '年龄', '城市'] ['张三', '25', '北京'] ['李四', '30', '上海'] ['王五', '22', '广州']
【毕业设计】基于Java+Springboot+Vue的宠物领养系统_pgj
让前端开发者学习“机器学习”!
【毕业设计】基于Java的实现的以宠物为主体的论坛式的APP
大模型应用工具实战2-有好玩的数字人
【毕业设计】基于ssm的选课管理系统