Apache之Digester

Apache Digester解析XML文档的实用教程 Apache Digester 是一个强大的开源库,它极大地简化了将 XML 文档转换为 Java 对象的过程。Digester 通过定义一系列的解析规则来实现这一过程,这些规则描述了 XML 元素与 Java 对象属性之间的映射关系。开发人员可以轻松地将 XML 文件中的数据填充到 Java 对象的字段中,极大地减少了编写解析代码的工作量。本章将带领读者认识 Digester 的核心组件,并探讨其在数据处理中的优势。 阅读详情

Digester是apache开源项目Commons中的一个子项目,是一款解析处理XML文档的工具。现在Java领域中流传了很多有关处理XML文 档解析的工具,除官方(Sun)的标准的SAX(最新版本2.0),DOM(最新版本3.0,在Tiger版本中集成)外[JAXP只是Sun定义的一组 规范接口],其他开源不泛多多,比如Jdom,Dom4j,Castor等等,包括这款Apache的digester。说到这里,你不得不佩服开源组织 的强大智慧的结晶,digester处理XML文档基于XML节点树Path的规则,实在给人一种赏心悦目之感,这也是偶一直对其情有独钟的最大理由。废 话免了,转入正题。
   刚说到Digester处理是基本类似于XML文档树节点遍历的规则来进行处理,底层处理是采用了SAX,基于事件驱动的模式。举个例子:
   <Company>
     <Technology>
       <name length="4">Corx</name>
       <date>2005.06.27</date>
     </Technology>
    
     <Product>
       <name length="4">Kxcp</name>
       <date>2004.12.29</date>
     </Product>
   </Company>
  
   在digester中,定义了一些规则(rule),对遍历的节点path预先对应好要处理的规则,即当解析器遍历到某个节点的时候,如果发现当前节点有对应的处理规则,调用相应的rule进行处理。举个例子:
   Company/Technology -> ObjectCreatedRule //对象创建规则
   Company/Technology/name -> BeanPropertySetterRule //属性存取规则
   ...
  
   对以上的解释可能还不太明白,不要着急,下面详细解释一下digester的基本原理,喝杯咖啡,慢慢来~
  
   首先看看org.apache.commons.digester.Digester这个类,查看source发现Digester本身继承了 DefaultHandler句柄,DefaultHandler句柄是SAX中基于时间驱动的缺省的句柄实现(包含ContentHandler, ErrorHandler, EntityResolver, DTDHandler),这个句柄不用多介绍了吧,相信用过SAX的哥们都明白。:)。刚刚不是说到了Rule了嘛,digester中定义了一个规则处 理接口org.apache.commons.digester.Rule,此接口类似于ContentHandler接口中的方法,稍稍有点不同,主要 有begin(), body(), end(), finish()方法。而digester缺省定义了许多有效的常用规则,每个规则都实现这个接口, 如果没有什么特殊需求,一般这些规则是够用了,罗列一下:BeanPropertySetterRule, CallMethodRule, CallParamRule, FactoryCreateRule, NodeCreateRule, ObjectCreateRule, ObjectParamRule,PathCallParamRule, SetNestedPropertiesRule, SetNextRule, SetPropertiesRule, SetPropertyRule, SetRootRule, SetTopRule,这些规则的意思稍后说。同时,对这些规则,digester还定义了一个规则的容器接口Rules(抽象类),这个抽象类接口容器 容纳规则,并定义了规则匹配的模式,digester实现了一个基本的匹配模式RulesBase,简要看看这个实现中的两个最重要的方法:
   .....
   public void add(String pattern, Rule rule) {
         // to help users who accidently add '/' to the end of their patterns
         int patternLength = pattern.length();
         if (patternLength>1 && pattern.endsWith("/" ) {
             pattern = pattern.substring(0, patternLength-1);
         }
        
        
         List list = (List) cache.get(pattern);
         if (list == null) {
             list = new ArrayList();
             cache.put(pattern, list);
         }
         list.add(rule);
         rules.add(rule);
         if (this.digester != null) {
             rule.setDigester(this.digester);
         }
         if (this.namespaceURI != null) {
             rule.setNamespaceURI(this.namespaceURI);
         }

     }

还有一个方法:
   ...
   public List match(String namespaceURI, String pattern) {

         // List rulesList = (List) this.cache.get(pattern);
         List rulesList = lookup(namespaceURI, pattern);
         if ((rulesList == null) || (rulesList.size() < 1)) {
             // Find the longest key, ie more discriminant
             String longKey = "";
             Iterator keys = this.cache.keySet().iterator();
             while (keys.hasNext()) {
                 String key = (String) keys.next();
                 if (key.startsWith("*/" ) {
                     if (pattern.equals(key.substring(2)) ||
                         pattern.endsWith(key.substring(1))) {
                         if (key.length() > longKey.length()) {
                             // rulesList = (List) this.cache.get(key);
                             rulesList = lookup(namespaceURI, key);
                             longKey = key;
                         }
                     }
                 }
             }
         }
         if (rulesList == null) {
             rulesList = new ArrayList();
         }
         return (rulesList);
     }
     ...
    
     以上基本实现只是digester默认匹配规则,如果你要更换自己的规则匹配模式,则只需要继承 org.apache.commons.digester.Rules接口,定义自己的匹配方式,digester同时还给我们提供了一个比较复杂,不过 非常常用的匹配模式,那就是通配符匹配模式,引入了”!“、”*“、”?“三个符号进行通配的匹配模式,这个类就是 org.apache.commons.digester.ExtendsBaseRules,后续再说。
    
     digester就是通过以上的几种接口组件,同时配合操作数栈,进行XML解析。具体说,就是在parse XML文档之前,预先向容器集合(默认就是RulesBase容器)对XML文档中的节点path注入匹配规则,然后在parse文档的时候,遭遇到节点 时时,调用SAX句柄中相应的方法,配合操作数栈,根据定义好的匹配模式,调用相应规则中的方法,将XML序列化成Java Object。介绍有点抽象,沿用digester本身带的例子介绍一下:
     ...
     //对如下的XML文档
     <address-book>
       <person id="1" category="acquaintance">
         <name>Gonzo</name>
         <email type="business">gonzo@muppets.com</email>
       </person>
       <person id="2" category="rolemodel">
         <name>Kermit</name>
         <email type="business">kermit@muppets.com</email>
         <email type="home">kermie@acme.com</email>
       </person>
     </address-book>
     ...
...
    
     Digester digester = new Digester();
    
     AddressBook book = new AddressBook();
     d.push(book); //将AddressBook实例压入堆栈
    
     digester.addObjectCreate("address-book/person", Person.class);//对person节点注入对象创建规则,即在SAX的事件遭遇到person节点的时候,创建Person类的实例,并压 入堆栈,此时堆栈中从栈顶到栈底分别为AddressBook实例,Person类实例。
     digester.addSetProperties("address-book/person" ;// 对person节点注入属性设置规则,即在SAX的事件遭遇到person节点中的Attributes时,根据属性列表中的属性值对,这儿就是 id="1", category="acquaintance",使用Java反射(reflection)机制,调用当前栈顶对象即Person实例类中id、 category属性的标准的JavaBean方法,setId, setCategory。
    
     digester.addSetNext("address-book/person", "addPerson" ;// 对person节点注入父节点方法调用规则,即在SAX事件遭遇到person节点的时候,调用栈中Person实例的父实例中的addPerson方 法。d.addCallMethod("address-book/person/name", "setName", 0);//对name节点注入方法调用规则,调用当前栈顶对象即Person实例中的setName方法,而此方法的参数即是当前name节点的字符内 容。通常这个规则和addCallParam规则配合使用,这儿是一种特殊情况。
     digester.addCallMethod("address-book/person/email", "addEmail", 2);//对email节点注入方法调用规则,调用当前栈顶对象即Person实例中的addEmail方法,此方法需要两个参数,一个是从属性值的 type属性获取,一个是从email本身的字符内容获取。
     digester.addCallParam("address-book/person/email", 0, "type" ;//对email节点注入参数调用规则,将当前节点的type属性值压入方法操作数栈
     digester.addCallParam("address-book/person/email", 1);//对email节点注入参数调用规则,将当前节点的字符属性值压入方法操作数栈。
    
     System.out.println(book);//打印book中值。。
     ...
    
     通过以上注释应该不难理解吧。
    
     下面再对以上所说的几种常用规则作一个详细的介绍:
     ObjectCreateRule:这个规则比较简单,此规则就是对指定的模式创建一个类的实例,并将当前实例压入堆栈,并且在遭遇元素结束
     时,将当前的栈顶实例弹出栈。
     对应Digester中有关这个规则的Javadoc方法说明:
       addObjectCreate(java.lang.String pattern, java.lang.Class clazz) - 方法参数说明了一切
       addObjectCreate(java.lang.String pattern, java.lang.String className) - 同上
       addObjectCreate(java.lang.String pattern, java.lang.String attributeName, java.lang.Class clazz) - 这个稍微解释一下,
       多了一个参数attributeName,这个参数的意思就是如果在当前匹配模式的节点中定义了属性,则默认就采用这个attributeName所
       对应的值来加载实例。比如以上面的例子加入person元素还有一个属性, class="test.org.apache.commons.digester.Person1",
       则此规则会加载Person1实例而不是Person实例。明白?!
       addObjectCreate(java.lang.String pattern, java.lang.String className, java.lang.String attributeName) -同上
      
     FactoryCreateRule:这个规则是基于工厂模式创建指定模式的一个类的实例。跟ObjectCreateRule类似,不同的是其参数Class继承了
     ObjectCreationFactory接口。此接口中有个方法createObject(Attributes attrs),创建类的实例,在规则中将此类的实例压入堆栈。
     对应Digester中有关这个规则的Javadoc方法说明:
       addFactoryCreate(java.lang.String pattern, java.lang.Class clazz) - 一目了然,不用说了。只是clazz必须是实现了
       ObjectCreationFactory接口的类。
       addFactoryCreate(java.lang.String pattern, java.lang.Class clazz, boolean ignoreCreateExceptions) - 同上,多了一个参
       数,ignoreCreateExceptions表明是否忽略在创建类的过程中忽略抛出的exception。
       addFactoryCreate(java.lang.String pattern, java.lang.Class clazz, java.lang.String attributeName) - 稍微介绍一下这里
       的attributeName参数,这个参数跟ObjectCreationRule规则中的attributeName雷同,不同的是这个属性的值必须是实现了接口
       ObjectCreationFactory接口的类。
       addFactoryCreate(java.lang.String pattern, java.lang.Class clazz, java.lang.String attributeName, boolean ignoreCreateExceptions)
       - 同上
       addFactoryCreate(java.lang.String pattern, ObjectCreationFactory creationFactory) - 同上
       addFactoryCreate(java.lang.String pattern, ObjectCreationFactory creationFactory, boolean ignoreCreateExceptions) - 同上
       addFactoryCreate(java.lang.String pattern, java.lang.String className) - 同上
       addFactoryCreate(java.lang.String pattern, java.lang.String className, boolean ignoreCreateExceptions) - 同上
       addFactoryCreate(java.lang.String pattern, java.lang.String className, java.lang.String attributeName) - 同上
       addFactoryCreate(java.lang.String pattern, java.lang.String className, java.lang.String attributeName, boolean ignoreCreateExceptions)

BeanPropertySetterRule:Bean属性设置规则,对匹配当前指定模式的元素设置bean属性同名或者指定属性的值。
     对应Digester中有关这个规则的Javadoc方法说明:
       addBeanPropertySetter(java.lang.String pattern)   - 对匹配当前指定模式的元素设置bean属性同名属性的值。
       addBeanPropertySetter(java.lang.String pattern, java.lang.String propertyName)   - 对匹配当前指定模式的元素设置bean属性指定属性的值。
      
     CallMethodRule:方法调用规则,对匹配当前指定模式的元素,初始化指定的方法类型和方法参数,并压入堆栈。此规则需要和CallMethodRule
     规则配合使用:
     对应Digester中有关这个规则的Javadoc方法说明:
       addCallMethod(java.lang.String pattern, java.lang.String methodName) - 初始化指定的方法,只是当前方法不需要任何参数。
       addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount) - 初始化指定的方法,参数个数为
       paramCount,参数类型缺省为java.lang.String。注意有种特殊情况,就是paramCount为0的时候,默认使用当前元素的字符数据作为
       参数值。
       addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount, java.lang.Class[] paramTypes) -
       同上,只是有指定的参数类型.
       addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount, java.lang.String[] paramTypes) -
       同上
      
     CallParamRule:提供CallMethodRule规则所需要的参数,必须跟CallMethodRule配合使用。
     对应Digester中有关这个规则的Javadoc方法说明:
       addCallParam(java.lang.String pattern, int paramIndex) - 使用匹配当前指定模式元素的字符数据作为索引为paramIndex的参数值.
       addCallParam(java.lang.String pattern, int paramIndex, boolean fromStack)   - 从操作数栈中,默认取出栈顶对象作为索引
       为paramIndex的参数值.
       addCallParam(java.lang.String pattern, int paramIndex, int stackIndex)   - 从操作数栈中,取出从栈顶数第stackIndex + 1个
       对象作为索引为paramIndex的参数值.
       addCallParam(java.lang.String pattern, int paramIndex, java.lang.String attributeName) - 使用属性attrbuteName的值作为
       索引为paramIndex的参数值.
      
     PathCallParamRule:提供当前匹配的模式路径作为方法调用所需要的参数,配合CallMethodRule使用。
     对应Digester中有关这个规则的Javadoc方法说明:
       addCallParamPath(java.lang.String pattern, int paramIndex) - 指定索引为paramIndex的值为当前匹配模式的路径.
     
     ObjectParamRule;指定对象作为指定索引的值,配合CallMethodRule使用。
     对应Digester中有关这个规则的Javadoc方法说明:
       addObjectParam(java.lang.String pattern, int paramIndex, java.lang.Object paramObj) - 指定索引为paramIndex的值为给定
       的对象的值.
      
     SetNestedPropertiesRule:当前匹配模式的直接子元素和对应bean的属性之间的映射.
     对应Digester中有关这个规则的Javadoc方法说明:
       addSetNestedProperties(java.lang.String pattern)   - 默认当前匹配模式的元素的直接子元素和bean中对应属性之间值的映射
       addSetNestedProperties(java.lang.String pattern, java.lang.String[] elementNames, java.lang.String[] propertyNames)    -
       当前匹配模式的直接子元素集和bean中属性集之间的映射
       addSetNestedProperties(java.lang.String pattern, java.lang.String elementName, java.lang.String propertyName) -
       当前匹配模式的直接子元素和bean中属性之间的映射

   SetNextRule:匹配当前模式时,将栈顶对象作为次栈顶对象中指定方法的参数。
   对应Digester中有关这个规则的Javadoc方法说明:
     addSetNext(java.lang.String pattern, java.lang.String methodName) - 指定次栈顶元素的方法名称,将栈顶对象作为指定方法的参数。
     addSetNext(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) - 指定次栈顶元素的方法名称和参数类型,将栈顶对象作为指定方法的参数。

   SetPropertiesRule:匹配当前模式的元素的属性与栈顶对象中同名或者指定对应关系的属性值。
   对应Digester中有关这个规则的Javadoc方法说明:
     addSetProperties(java.lang.String pattern) - 指定栈顶对象属性的值为当前匹配元素中同名元素属性的值。
     addSetProperties(java.lang.String pattern, java.lang.String[] attributeNames, java.lang.String[] propertyNames) - 对应栈顶对象属性的值为指定的当前匹配元素中元素属性的值
     addSetProperties(java.lang.String pattern, java.lang.String attributeName, java.lang.String propertyName)   - 同上

   SetPropertyRule:不常用的一个规则,主要用于key-value值对。一个元素属性为栈顶对象的属性,一个元素属性为栈顶对象的属性的值。
   对应Digester中有关这个规则的Javadoc方法说明:
     addSetProperty(java.lang.String pattern, java.lang.String name, java.lang.String value) - name和value都是匹配当前模式的元素属性,name的值是栈顶对象中同名的属性名称,而value的值是栈顶对象中属性名称为name的值。(好 像有点绕口)

   SetRootRule:将当前栈顶对象作为根对象中指定方法的参数。
   对应Digester中有关这个规则的Javadoc方法说明:
     addSetRoot(java.lang.String pattern, java.lang.String methodName) - 将当前栈顶对象作为根对象中指定为methodName方法的参数。
     addSetRoot(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) -   同上,只是多了一个方法参数的类型

   SetTopRule:与SetNextRule正好想法,是将次栈顶元素作为栈顶元素指定方法的参数。
   对应Digester中有关这个规则的Javadoc方法说明:
     addSetTop(java.lang.String pattern, java.lang.String methodName) - 将次栈顶元素作为栈顶元素指定为methodName方法的参数。
     addSetTop(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) -   同上,只是多了一个方法参数的类型

   前面介绍的基本就是digester的常用主要用法,正常来说足够了!不过为了提供一些额外更强大的扩展,digester提供了扩展的通配符匹配规则, 更强大也更方便!那就是ExtendedBaseRules,这个类扩展了基本的匹配规则RulesBase,提供了更通用的通配符匹配规则,以下简要介 绍一下:
   首先说一下基本的匹配模式,有三种:
   Parent Match(可以理解为匹配子元素的精确父匹配):a/b/c/? */a/b/c/?
   Ancester Match(可以理解为匹配那种出身自一个精确序列元素的元素):a/b/* */a/b/*
   Universal Wildcard Match(可以理解为通配符匹配,都以!开头):!*a/b !a/b/? !*a/b/? !a/b/* !*/a/b/*
   Wild Match (可以理解为更通用更模糊的通配符匹配):* !*

   ?代表直接子元素
   * 代表任意的父或子元素
   ! 代表以什么什么为开头

   举个例子:
         Digester digester = new Digester();
         digester.setRules(new ExtendedBaseRules());
         digester.setValidating(false);
        
        
         digester.addObjectCreate("!*/b", BetaBean.class);
         digester.addObjectCreate("!*/a", AlphaBean.class);
         digester.addObjectCreate("root", ArrayList.class);
         digester.addSetProperties("!*" ;
         digester.addSetNext("!*/b/?", "setChild" ;
         digester.addSetNext("!*/a/?", "setChild" ;
         digester.addSetNext("!root/?", "add" ;
         ArrayList root =
             (ArrayList) digester.parse(getInputStream("Test4.xml" );
        
         assertEquals("Wrong array size", 2, root.size());
         AlphaBean one = (AlphaBean) root.get(0);
         assertTrue(one.getChild() instanceof BetaBean);
         BetaBean two = (BetaBean) one.getChild();
         assertEquals("Wrong name (1)", two.getName() , "TWO" ;
         assertTrue(two.getChild() instanceof AlphaBean);
         AlphaBean three = (AlphaBean) two.getChild();
         assertEquals("Wrong name (2)", three.getName() , "THREE" ;       
         BetaBean four = (BetaBean) root.get(1);
         assertEquals("Wrong name (3)", four.getName() , "FOUR" ;
         assertTrue(four.getChild() instanceof BetaBean);
         BetaBean five = (BetaBean) four.getChild();
         assertEquals("Wrong name (4)", five.getName() , "FIVE" ;

    Test4.xml文件:
   
     <root>
       <a name="ONE">
         <b name="TWO">
             <a name="THREE"/>
         </b>
       </a>
       <b name="FOUR">
         <b name="FIVE"/>
       </b>
     </root>

掌握Apache Commons Digester解析XML的实战指南 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它被设计为能够描述各种类型的数据,从简单的数据列表到复杂的数据结构。XML以一种不依赖于应用程序或供应商的格式,使数据的存储和共享变得简单。XSD(XML Schema Definition)是一种用于定义XML文档结构的XML语法。它不仅可以描述数据的结构,还能指定数据类型的约束,如数值范围、字符串长度等。XSD是XML的验证机制,确保XML文档符合既定的规则和结构。 阅读详情

相关推荐

Apache Commons Digester XML解析实践指南

在信息技术飞速发展的今天,可扩展标记语言(XML)作为一种灵活的数据表示方式,在众多领域发挥着重要作用。从简单的配置文件到复杂的业务数据交换,XML凭借其结构化、可扩展以及人类可读的特点,成为数据交换的标准语言之一。Apache Commons Digester是一个用于解析XML文档并将XML文档内容映射到Java对象的工具库。它通过定义一系列的规则来实现对XML文档的处理,可以简化XML文档到Java对象的映射过程。

weixin_42602368的博客 967

Apache Commons Digester(Digester2.0)学习笔记

digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5.基本概念1. 在Digester的内部采用SAX来解析XML文件。为了能够正确的使用它,必须在

都市小混混 4469

Apache Commons Digester组件解析与应用

Rule可以分为以下几类:实例化规则(Instantiation Rules):当遇到特定的XML节点时,用于创建对象的规则。属性规则(Property Rules):用于设置对象属性的规则。操作规则(Action Rules):执行自定义方法或者脚本的规则。特殊规则(Special Rules):如等,它们具有特定的目的和功能。

weixin_42388898的博客 393

Tomcat 源码分析 (Digester类的使用) (十)

Digester类的使用 解析xml

959 635

使用Apache的Digester来解析XML文档

使用Apache的Digester来解析XML文档,代码,有解析!

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 790

Digester学习(摘自digester_百度百科)

[b]digester简介[/b] Digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件。显然,将XML文件转换成相应的Java对象是一项很通用的功能,这个工具理应具有更广泛的用途,所以很快它就在Jakarta Commons项目(用于提供可重用的Java组件库)中有了一席之地。     如今Digester随着...

Ben's Life 330

稳压电源的隐形战场:动态特性如何影响你的嵌入式系统稳定性

本文深入探讨了稳压电源动态特性对嵌入式系统稳定性的关键影响,分析了HT7533和AMS1117等稳压芯片在输入阶跃响应和负载瞬态响应方面的性能差异。通过实测案例展示了不同场景下的动态特性表现,并提供了针对工业控制、IoT设备和射频系统的选型指南与优化策略,帮助工程师解决电源相关的隐蔽故障。

weixin_29204205的博客 609

org.apache.commons.digester.Digester 解析 XML文件或者流

最近在做快捷支付这块,对XML这块接触的比较多.梳理XML这块的时候, 突然发现 Digester 对不管是 字符串的 XML 还是 XML文件都能很好的解析..不足点就是引用的 apache的东西有点多. (apache的东西 耦合性太高.....)不过确实好用..   首先是 import   import org.apache.commons.digester.Digester; ...

小科的奋斗 645

Matlab GUIDE -- 串口操作

1、首先新建-->应用程序-->GUIDE。 2、绘制一个简单的UI。 3、然后右击“打开串口”图标-->查看回调-->callback,即可打开此图标的回调函数,此回调函数是press button时执行(可按需要选择其他回调)。 4、在回调函数中添加打开串口的代码。 delete(instrfindall); %删除所有串口 s3 = serial('CO

Asgard-X 2837

uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. MDK5.37安装ARM_Compiler_5

MDK5.37安装ARM_Compiler_5 最后一个AC5编译器,从MDK5.37开始,不再默认安装,需要独立安装 ARMCompiler_506_Windows_x86_b960.zip (80.94MB) 否则使用AC5编译代码报错如下: Build started: Project: Project *** Target 'STM3210C_EVAL' uses ARM-Compiler 'Default Compiler Version 5' which is not available. *

mowwwcom的专栏 2万+

Apache Commons Digester 初步

Apache Commons Digester是对SAX的封装,用于直接通过XML文件来生成Java类实例 通常在使用SAX解析XML的时候,需要覆盖DefaultHandler类的startDocument、startElement、characters、endElement、endDocument等方法。这样编程过于复杂不友好,而且对于不同的XML格式需要编写不同的DefaultHand

我想跟代码谈谈 4141

朱长江《偏微分方程简明教程》答案第一章部分

偏微分方程简明教程第一章习题1.1 第一章 习题1.1 1、指出下列方程的阶,并判断它是线性的还是非线性的。如果是线性的,说明它还是其次的: (1)ut−(uxx+uyy)+1=0;(2)ut−uxx+xu=0;(3)ut−uxxt+uux=0;(4)ux2+uuy=0;(5)utt−uxx+t2+x2=0;(6)ux+eyuy=0;(7)ut+uxxxx+1+u=0;(8)ux(1+ux2)−12+uy(1+uy2)−12=0;(9)∂4u∂x4+2∂4u∂x2∂y2+∂4u∂y4=0;(10)∂3u∂x

ymengm的博客 6760

apache digester简介

digester简介 Digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件。显然,将XML文件转换成相应的Java对象是一项很通用的功能,这个工具理应具有更广泛的用途,所以很快它就在Jakarta Commons项目(用于提供可重用的Java组件库)中有了一席之地。  如今Digester随着Struts的发展以及其的公用性而被

2272

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

Calibre DRC

calibre DRC的运行方法,包括merge gds和加用dummy rule加dummy的方法

m0_61544122的博客 1万+

digester_Apache Digester示例–轻松配置

digester 解决问题–硬编码,需要为您的应用程序创建自定义配置,例如struts配置文件,仅通过更改文件即可改变应用程序的行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结构。 请参阅下面的“摘要”。 Digester引入了三个重要概念: 元素匹配模式 处理规则 ...

最佳 Java 编程 288

红绿灯背后的数学:如何用Java算出“黄金绿灯时间“?

本文探讨了城市交通信号灯配时优化的数学原理与Java实现方法。文章首先分析了信号灯配时不合理导致的交通问题,指出精确计算绿灯时长的重要性。核心内容包括:1)基于M/M/1排队模型建立车流量数学模型,通过优化算法最小化总等待时间;2)使用Java实现信号灯优化控制器,采用梯度下降法动态调整绿灯时长。文中提供了完整的Java代码实现,包括信号灯控制器基类和优化控制器类,采用原子类保证线程安全,并详细解释了关键算法原理和实现细节。该方案可为城市智能交通系统提供理论支持和技术实现参考。

墨夶的博客 1345

学习一下org.apache.commons.digester.Digester

 The Example Document and BeansIn this example, we will unmarshall the same XML document that we used in the previous article:Author 1Title 1Author 2His One BookMag Title 1Some Headline

GetStudyMessages的专栏 8306

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Apache Digester示例–轻松配置

解决问题–硬编码,需要为您的应用程序创建自定义配置,例如struts配置文件,仅通过更改文件即可改变应用程序的行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结构。 请参阅下面的“摘要”。 Digester引入了三个重要概念: 元素匹配模式 处理规则 对象堆栈。 ...

最佳 Java 编程 344

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Apache Digester

Apache Digester应用实例 :http://binker.iteye.com/blog/39330

zfl092005的专栏 539

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

apache Digester

[url]http://commons.apache.org/digester/commons-digester-1.6/docs/api/[/url] [code="xml"] [/code] [code="java"] public class Man { String name; int age; public String g...

hacker_zxf的专栏 138

Apache Commons Digester

<br /><br />使用Apache Commons Digester <br />    本文主要参考了The serverside上的一篇文章。描述了2种典型的使用digester的方法,以及所需要注意的地方。详细内容请参见正文。 <br />Apache Commons Digester<br />       简化xml文件处理,它依赖的组件:BeanUtils、Logging、Collections。基本概念<br />1.         在Digester的内部采用SAX来解析XML文件。

leon 856

【Java Xml】Apache Commons Digester3解析

Apache Commons Digester3

爱喝星冰乐的博客 586

Apache commons digester简介说明

Apache commons digester简介说明

qq_25073223的博客 846
上一篇: 用于Commons Digester的基于XML的规则集
下一篇: java基于UDP的socket通信
jackoo
博客等级 码龄18年 5粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值