版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8.使用Java语言对XML数据进行解析,Java语言和XML数据格式都被认为是过去数十年中最为重要的IT技术之一。Java为编程提供了一种与平台无关的语言,从而导致了程序开发领域的一场革命。XML为数据交换提供了一种与平台无关的表现形式,从而使得这场革命更加激烈、更加彻底。Java和XML之间存在有许多相似的特性,比如平台无关性、可扩展性、可重用性和国际化支持。XML和Java常常被认为是完美的组合,使用XML的半结构化模型描述各种各样的业务数据、表达复杂的业务信息,后台则使用Java语言来实现独立于平台的、易于处理的面向对象的应用软件解决方案。,用于XML数据处理的JavaAPI,IBM、
2、Apache以及其他许多公司,开发了很多用于XML数据处理的JavaAPI。从JDK1.4开始,Sun公司将一些非常重要的代码库集成到了Java2平台之中,并不断升级更新,直到JDK1.6。在尚未发布的Java7中,Sun公司努力实现对XML的语言级支持。对于其它的语言也同样如此(比如C+、Perl、.NET),作为一名程序开发人员,需要在首先了解XML相关技术的基础上,熟练掌握有关XML数据处理的程序开发技巧,才能顺利完成开发任务。,JDK1.6中面向XML的JAVAAPI,用于XML数据处理的JAVAAPI(JavaAPIforXMLProcessing,JAXP)。JAXP对应于JDK中
3、的javax.xml包及其部分子包、org.w3c.dom包及其子包、org.xml.sax包及其子包;用于XML数据绑定的JavaAPI(JavaAPIforXMLBinding,JAXB),对应于JDK中的javax.xml.bind包及其子包;用于基于XML的RPC的JavaAPI(JavaAPIforXML-basedRPC,JAX-RPC),对应于JDK中的javax.jws包及其子包;用于带附件的SOAP消息的JAVAAPI(SOAPwithAttachmentsAPIforJava,SAAJ),对应于JDK中的javax.xml.soap包及其子包;用于基于XML的Web服务的J
4、avaAPI(JavaAPIforXML-basedWebservices,JAX-WS),对应于JDK中的javax.xml.ws包及其子包;用于XML加密签名的JavaAPI,对应于JDK中的javax.xml.crypto包及其子包;,8.1XML数据解析的概念及JAXP简介,XML解析器实际上就是能够识别XML基本语法形式的特殊应用程序,并将纯文本的XML文档转换成其他某种内存中表现形式(比如XML文档树、或者一系列的解析事件),以便客户端应用程序能够方便地对XML文档中的数据进行访问、提取、检索。Xerces来自IBM在1999年捐赠给Apache的XML4J项目,随后成为了Apac
5、heXMLProject的子项目。但由于XML技术的迅速发展,在2004年,Xerces解析器成为了ApacheSoftwareFoundation的顶级项目(独立项目)。,DOM和SAX解析模型简介,DOM(DocumentObjectModel)是W3C的规范(/DOM/),是一种与浏览器、平台、语言无关的接口,可用于表示各种半结构化的、层次模型的数据(比如HTML、XML等)。SAX(SimpleAPIforXML)是顺序读取XML的解析器API,是一个为基于事件XML解析器定义的、免费的、并且与平台、语言无关的API。由XML-Dev邮件列表组织(由许多
6、XML方面的专家和开发人员组成)开发而来,并且已经成为了一种XML数据处理的事实上的标准。,DOM解析模型,DOM是以层次结构组织的节点或信息片断的集合,是XML数据的一种树型表示,通过树中的各种节点、以及节点之间的父子关系来表示XML文档中的元素、属性、文本内容,以及元素之间的嵌套关系。这个层次结构允许开发人员在树中寻找特定信息,并对其中的数据进行修改和创建。,SAX解析模型,SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件(如图8-2中所示),当发生相应事件时,将调用一个回调方法,回调方法的编写是数据解析的关键。,JAXP简介,JAXP是JavaAPIforX
7、MLProcessing的首字母缩写(读作jaks-p),是SUNJavaJDK中的XML编程API,它为解析、处理、验证XML文档数据的基本功能提供了相应的编程接口。作为处理XML数据的Java抽象层,JAXP规范本身也在不断地发展,目前JDK1.6中的JAXP的版本为JAXP1.4。,JAXP的本质,XML解析器种类繁多,开发人员希望不修改源代码就能够更换底层所使用的XML解析器呢,这就必须“对抽象进行编程”,以实现底层解析器的可插入性。,8.2在JAXP中使用DOM解析器处理XML文档,DocumentBuilderFactorydbf=DocumentBuilderFactory.ne
8、wInstance();tryDocumentBuilderbuilder=dbf.newDocumentBuilder();DocumentdomDoc=builder.parse(fileName);catch(ParserConfigurationExceptione)e.printStackTrace();,8.2.1使用JAXP,在JAXP中,newInstance在确定具体解析器工厂实现类时,将按照下面的顺序进行搜索:使用javax.xml.parsers.DocumentBuilderFactory系统属性。使用JRE文件夹中的属性文件lib/perties。此配
9、置文件格式为标准的java.util.Properties且包含实现类的完全限定名,其中实现类的键是上述定义的系统属性。JAXP实现只读取一次perties文件,然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是否存在。首次读取perties后,其中的属性值不能再更改。使用ServicesAPI(在JAR规范中进行了详细描述)来确定类名称。ServicesAPI将查找在运行时可用的jar中META-INF/services/javax.xml.parsers.DocumentBuilderFactory文件中的类名。平台默认的
10、DocumentBuilderFactory实例。,8.2.2DOM解析器编程接口,org.w3c.xml.Node接口,Node接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。Node接口中包含如下主要内容:表示节点类型的常量、及获得节点类型信息的方法;获得节点基本信息(名称、值)的方法;获得节点层次信息的方法;,shortnodeType=node.getNodeType();switch(nodeType)caseNode.DOCUMENT_NODE:.break;caseNode.ELEMENT_NODE:.break;caseNode.ATTRIBUTE_NODE:
11、.break;caseNode.TEXT_NODE:.break;.,获得节点的名称getNodeName()、节点的值getNodeValue(),NodeListxNodeList=xNode.getChildNodes();for(inti=0;ixNodeList.getLength();)childNode=xNodeList.item(i);.,for(inti=0;iattrs.getLength();i+)AttrattrNode=attrs.item(i);/item()方法表示可以按某种顺序访问属性集合,而属性本身是没有顺序的。.,org.w3c.xml.Document接
12、口,Document接口表示整个HTML或XML文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。请注意,文档的根元素节点并不是文档节点,文档节点在根元素节点之上,是一个无形的节点。Document接口还包含所需的、创建这些对象的工厂方法。文档节点Document接口中提供了一系列的create方法(所有的创建工作都必须使用文档节点),比如:createElement(StringtagName)创建指定类型的元素节点。createAttribute(Stringname)创建给定名称的Attr节点。createTextNode(Stringdata)创建指定字符串的Text节点。
13、,DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=dbf.newDocumentBuilder();Documentdoc=builder.newDocument();NodexNode1=doc.createElement(family);doc.appendChild(xNode1);NodexNode2=doc.createElement(parent);xNode1.appendChild(xNode2);NodexNode3=doc.createElement(
14、child);xNode1.appendChild(xNode3);.,org.w3c.xml.Element接口,Element接口表示XML文档中的一个元素。可使用getAttributes()来获得元素所有属性的集合attributes(Node接口的方法);可使用Node接口提供的getChildNodes()方法获得子元素列表。定义了getElementsByTagName(Stringname),它将以文档顺序返回具有给定标记名称的所有后代元素的NodeList。,org.w3c.xml.Attr接口,Attr接口表示Element对象中的属性。通常该属性所允许的值定义在与文档相关
15、的模式中。Attr对象继承Node接口,但由于它们实际上并不是相关元素的子节点,DOM不会将它们看作文档树的一部分。Node的属性parentNode、previousSibling和nextSibling都将返回null。如果要获得属性所属的元素,不能使用Node接口中定义的getParentNode()方法,而应该使用Attr接口中定义的getOwnerElement()方法。,org.w3c.xml.CharacterData接口及其子接口,CharacterData接口用于表示XML文档中以文本内容为主的节点,其子接口包括:CDATASection、Comment、Text。Chara
16、cterData接口中提供了各种操作文本数据的方法:appendData(Stringarg)将字符串追加到节点的字符数据的结尾。deleteData(intoffset,intcount)从该节点移除某个范围的字符。getData()获取文本内容。setData(Stringdata)设置文本内容。,org.w3c.xml中的其他接口,DOM文档树中还包括一些其他类型的节点,比如ProcessingInstruction、Notation、Entity等等。此外,org.w3c.xml中还定义了一些在解析XML数据时使用到的其他接口,比如前面提到的NodeList节点列表接口、NamedNo
17、deMap命名节点映射接口等等。熟练地掌握针对上述接口的操作,是解析XML文档数据的关键。,8.2.3使用DOM模型解析XML文档的示例程序,DomEcho.java,8.3在JAXP中使用SAX解析器处理XML数据,从本质上看,SAX是一种事件驱动的XML数据处理模型。SAX是通过callback回调函数来处理XML元素的,这样,SAX处理XML时,是从头开始,对XML元素是一个一个地处理。所以可以有效地抑制内存的消耗,适合处理大内容的XML文档。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的标记。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得
18、到了更好的体现。,8.3.1JAXP中SAX模型的使用,在JAXP1.4中使用SAX模型进行数据处理时,将使用到javax.xml.parsers包、org.xml.sax包及其子包(org.xml.sax.ext包和org.xml.sax.helpers包)。将简要介绍这些包中常用的一些基本类和接口、以及它们之间的关系(有关所有的类、接口、异常的内容,请参见JDK开发文档),然后说明使用SAX解析器的一般步骤。,SAX相关类库的介绍(1),javax.xml.parsers包中有关SAX模型的Java类:SAXParserFactory(抽象类)SAXParser(抽象类)创建SAX解析器对
19、象之后,可以使用SAXParser类的parse()方法对XML文档进行解析。,SAXParserFactoryspf=SAXParserFactory.newInstance()缺省情况下,JAXP将使用JDK1.6中自带的Xerces提供的SAX解析器实现的工厂类:ernal.jaxp.SAXParserFactoryImpl,SAXParsersp=spf.newSAXParser();在缺省情况下,使用的SAX解析器实现为:ernal.jaxp.SAX
20、ParserImpl,SAX相关类库的介绍(2),解析事件处理程序(接口)ContentHandlerDTDHandlerEntityResolverErrorHandlerXMLReader(接口)XML解析器SAX2驱动程序必须实现的接口,voidsetContentHandler(ContentHandlerhandler)/ContentHandlergetContentHandler()允许应用程序注册内容事件处理程序。voidsetDTDHandler(DTDHandlerhandler)/DTDHandlergetDTDHandler()允许应用程序注册DTD事件处理程序。voi
21、dsetEntityResolver(EntityResolverresolver)/EntityResolvergetEntityResolver()允许应用程序注册实体解析器。voidsetErrorHandler(ErrorHandlerhandler)/getErrorHandler(),SAX相关类库的介绍(3),org.xml.sax.ext包中有关SAX模型的Java类:LexicalHandler(接口):SAX2的可选扩展处理程序,以提供关于XML文档的词汇信息,例如,对注释和CDATA段的处理。通常不需要为XMLReader注册此处理程序,它不是核心SAX2的内容。,SAX
22、相关类库的介绍(4),org.xml.sax.helpers包中有关SAX模型的Java类:JDK的org.xml.sax.helpers包中提供了一个DefaultHandler类,该类实现了ContentHandler、DTDHandler、EntityResolver、ErrorHandler四个接口,并为其中所有的方法提供了空的实现。这样一来,我们只需要继承这个类,并重写其中感兴趣的回调函数即可。实际上,这正是设计模式中常用的“缺省适配器模式”。,使用SAX解析器的几种方法(1),直接用SAXParser解析器对象的parse(.)方法解析输入XML文档,SAXParserFactor
23、yspf=SAXParserFactory.newInstance()SAXParsersp=spf.newSAXParser();/MyDefaultHandler是用户编写的DefaultHandler的子类,重写了所需的回调函数sp.parse(newFile(bib.xml),newMyDefaultHandler();,使用SAX解析器的几种方法(2),使用SAXParser解析器对象中包含的XMLReader对象来解析XML文档。,SAXParserFactoryspf=SAXParserFactory.newInstance()SAXParsersp=spf.newSAXPars
24、er();XMLReaderreader=sp.getXMLReader();/MyContentHandler是用户编写的ContentHandler的实现类,重写了所需的回调函数reader.setContentHandler(newMyContentHandler();/MyDTDHandler是用户编写的DTDHandler的实现类,重写了所需的回调函数reader.setDTDHandler(newMyDTDHandler()/MyEntityResolver是用户编写的EntityResolver的实现类,重写了所需的回调函数reader.setEntityResolver(new
25、MyEntityResolver()/MyErrorHandler是用户编写的ErrorHandler的实现类,重写了所需的回调函数reader.setErrorHandler(newMyErrorHandler()reader.parse(newInputSource(newFileInputStream(newFile(bib.xml);,额外功能的使用,在使用SAX解析器时,可以在程序中启用某些额外的功能,比如支持验证、支持命名空间等等。SAXParserFactory中为此提供了一些设置方法:,8.3.2SAX模型中回调函数的重写,使用SAX模型解析XML数据的关键在于编写适当的回调函
26、数,并在其中实现所需的数据处理逻辑。下面将详细地介绍每种回调函数的作用和使用,当然还需要确定一个假想的数据处理逻辑,这里假设在对某个XML文档进行处理时,仅仅只是将其中的内容复制一遍(这个处理逻辑非常简单,后面将其称为SAXEcho任务),那么应该如何编写相应的回调函数呢?,voidsetDocumentLocator(Locatorlocator),接收文档事件的Locator对象。默认情况下,不执行任何操作。如果应用程序编写者希望存储定位器以用于其他的文档事件,则可以在子类中重写此方法。该定位器仅在调用SAX事件回调期间,在startDocument返回之后,调用endDocument之前
27、,返回正确的信息。,用例:对于SAXEcho任务,如果需要在某个事件发生时,获得该事件对应于XML文档中的位置,则可以编写如下代码。privateLocatorlocator;voidsetDocumentLocator(Locatorlocator)this.locator=locator;,voidstartDocument(),接收文档开始的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的开始采取特定的措施(如分配树的根节点或创建输出文件)。通常,发生在其他任何事件回调(不包括setDocumentLocator)之前,SAX解析器仅调用此方法一次。,
28、用例:对于SAXEcho任务,在碰到startDocument事件时表示开始处理输入XML文档内容,这时只需要输出XML声明即可。voidstartDocument()System.out.print(n);,voidendDocument(),接收文档结束的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的结束处采取特定的操作(如,结束树或关闭输出文件)。SAX解析器仅调用此方法一次,并且它将是解析期间最后调用的方法。直到解析器放弃解析(由于不可恢复的错误)或到达输入的结尾时,它才可以调用此方法。,用例:对于SAXEcho任务,在碰到endDocument事
29、件时表示即将结束对输入XML文档内容的处理,不需要进行任何操作。voidendDocument()/Donotneedtodoanything.,用例:对于SAXEcho任务,在碰到startElement事件时表示处理到某个XML元素的开始标记,这时需要手动输出该元素开始标记的所有内容(包括属性、命名空间声明)。voidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesattrs)System.out.print();,voidstartElement(Stringuri,StringlocalName
30、,StringqName,Attributesattributes),接收元素开始的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如分配新的树节点或将输出写入文件)。,voidendElement(Stringuri,StringlocalName,StringqName),接收元素结束的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。SAX解析器会在XML文档中每个元素的末尾调用此方法;对于每个endElement事件都将有相应的st
31、artElement事件(即使该元素为空时)。,用例:对于SAXEcho任务,在碰到endElement事件时只需输出元素的结束标记即可。voidendElement(StringnamespaceURI,StringlocalName,StringqName)System.out.print();,voidcharacters(charch,intstart,intlength),接收元素中字符数据的通知。默认情况下,不执行任何操作。应用程序编写者可以重写此方法,以便对每块字符数据采取特定的措施(如将该数据添加到节点或缓冲区,或者将该数据打印到文件)。,用例:对于SAXEcho任务,在碰到文
32、本内容时,需要进行复制输出。publicvoidcharacters(charch,intstart,intlength)System.out.print(newString(ch,start,length);,比如XML数据StevensW.,将两次进入characters回调函数,每次在该回调函数中,使用newString(ch,start,length)可以获得当前处理的文本内容。,voidignorableWhitespace(charch,intstart,intlength),接收元素内容中可忽略空白的通知。默认情况下,不执行任何操作。应用程序编写者可以重写此方法,以便对每块可忽略
33、的空白采取特定的措施(如将数据添加到节点或缓冲区,或者将数据打印到文件)。,对于下面的输入XML文档:StevensW.,如果按照前面的方法重写characters,而不重写ignorableWhitespace回调函数,完全能够得到正确地结果(即输出与输入完全相同)。,可忽略的空白字符(ignorableWhitespace),SAX解析器并不会主动地忽略输入文档中的空白字符(所以使用characters回调函数就能够对空白字符进行处理),除非指定SAX解析器使用验证功能,并且根据所提供的模式,能够判断出其中包含了多余的空白字符。,StevensW.,如果仅仅按照上面的方法重写charact
34、ers,而不重写ignorableWhitespace回调函数,那么输出结果:StevensW.,voidignorableWhitespace(charch,intstart,intlength)characters(ch,start,length);,voidprocessingInstruction(Stringtarget,Stringdata),接收处理指令的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个处理指令采取特定的措施,如设置状态变量或调用其他的方法。,用例:对于SAXEcho任务,在碰到处理指令时,需要进行复制输出。voidprocess
35、ingInstruction(Stringtarget,Stringdata)System.out.print(0)System.out.print();System.out.print(data);System.out.print(?);,有关命名空间的回调函数,voidstartPrefixMapping(Stringprefix,Stringuri)接收名称空间映射开始的通知。默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个名称空间前缀范围的开始处采取特定的操作。voidendPrefixMapping(Stringprefix)接收名称空间映射结束的通知。默
36、认情况不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个前缀映射的结束处采取特定操作。,错误处理回调函数,voidwarning(SAXParseExceptione)接收解析器警告的通知。默认实现不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个警告采取特定措施,如在日志文件中插入消息,或将其打印到控制台。voiderror(SAXParseExceptione)接收可恢复的解析器错误的通知。默认实现不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个错误采取特定的措施,如在日志文件中插入消息,或者将它打印到控制台。voidfatalError(SAX
37、ParseExceptione)报告严重的XML解析错误。默认的实现抛出SAXParseException。,8.3.3使用SAX模型解析XML文档的示例程序,SAXSample.java(从XML文档构造Employee类的对象集合)。,8.4DOM和SAX之间的性能分析和比较,saxVSdom应用程序。DOM和SAX的性能比较。,8.5JAXP中的其它XML数据处理API,执行XPath查询使用TraxAPI执行数据转换操作执行XQuery查询,执行XPath查询(1),1.实例化一个XPathFactory2.使用XPathFactory创建一个XPath对象,javax.xml.xpa
38、th.XPathFactoryfactory=javax.xml.xpath.XPathFactory.newInstance();缺省情况下,JDK1.6中将使用:ernal.jaxp.XPathImpl,javax.xml.xpath.XPathxpath=factory.newXPath();,执行XPath查询(2),3.(可选步骤)将XPath表达式字符串编译为XPathExpression对象:,javax.xml.xpath.XPathExpressionexpression=pile(/doc/name);,通常
39、可以使用XPpile(Stringexpression)将XPath表达式字符串编译为一个XPathExpression对象,以便稍后使用;当然,执行之前的编译操作并不是必须的,这是一个可选的步骤,您也可以直接计算XPath对象。XPathExpression对象和XPath对象的区别在于,如果需要反复针对多个上下文执行同一个XPath查询计划,那么应该首先对其进行编译,以便重用。,执行XPath查询(3),4.针对一个输入文档,计算XPath表达式(使用经过编译的XPathExpression对象,或者未经过编译的XPath对象)XPathJaxp.java,expression.evalu
40、ate(neworg.xml.sax.InputSource(foo.xml);xpath.evaluate(/doc/name,neworg.xml.sax.InputSource(foo.xml);,XPathExpression类的evaluate方法:Stringevaluate(Objectitem)Objectevaluate(Objectitem,QNamereturnType)Stringevaluate(InputSourcesource)Objectevaluate(InputSourcesource,QNamereturnType),参数QNamereturnType的值
41、可能为:XPathConstants.BOOLEANXPathConstants.NUMBERXPathConstants.STRINGXPathConstants.NODESETXPathConstants.NODE,使用TraxAPI执行数据转换操作(1),转换任务的输入可能是URL、XML流、DOM树、SAX事件、或者专用格式和数据结构,输出类型大致与输入类型相同,如果有n种输入、n种输出,那么一共就有n2种组合。因此,对于转换API来说,最重要地就是如何处理输入和输出的各种可能的组合。从JDK1.5中的JAXP1.3起,就开始将TrAX(TransformationAPIforXML)
42、集成到了核心的Java开发环境中。TrAX主要由下列软件包组成:javax.xml.transform:定义用于处理转换指令、以及执行从源到结果的转换的API。javax.xml.transform.sax:实现特定于SAX2的转换API。javax.xml.transform.dom:此包实现特定于DOM的转换API。javax.xml.transform.stream:实现特定于流和URI的转换API。,使用TraxAPI执行数据转换操作(2),TransformerFactory是处理转换指令的一种对象,可以由它产生Templates,一个Templates可以产生一个Transformer,后者可以将一个或多个Source转换为一个或多个Result。要使用TrAXAPI,必须首先创建一个TransformerFactory,它可以直接提供Transformer
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年江苏省苏州市震泽中学高三期末热身联考化学试题含解析
- 人工智能在语言处理中的创新应用
- Unit 1 More about me:Lesson 4(教学设计)北师大版(2024)英语三年级下册
- 2025年新乡市第一人民医院医护人员招聘考试试题附答案详解
- 餐饮健康企业诚信经营承诺书范文5篇
- 2026年国家开发银行(湖南省分行)人员招聘考试备考题库及答案详解
- 人工智能优化的便携式疼痛管理策略
- 第1课 提炼与抽象-顺畅沟通世界教学设计高中美术人教版2019选择性必修4 设计-人教版2019
- 2025年福建中医学院附属省第二人民医院医护人员招聘考试试题附答案详解
- 第四课 正确面对嫉妒教学设计小学心理健康人教版五年级下册-人教版
- 化工厂设备卫生管理制度
- GB/T 28253-2025挤压丝锥
- 高校横向合同管理
- 2025年高考历史天津市卷含解析及答案
- GB/T 9347-2025氯乙烯-乙酸乙烯酯共聚物中乙酸乙烯酯的测定方法
- (正式版)DB54∕T 0275-2023 《民用建筑节能技术标准》
- 《土木工程智能施工》课件 第4章 基础工程-深基础工程-预制桩施工
- 《土木工程智能施工》课件 第4章 基础工程-浅基础工程
- 铝熔融安全培训课件
- 2025年国家能源投资集团有限责任公司校园招聘笔试备考题库含答案详解(新)
- 2025年乒乓球裁判证考试试题及答案
评论
0/150
提交评论