jaxp对xml的操作(JAXP的演进)

最近重新温习了Jaxp对xml的操作,在网上搜索了一些这方面的资料!觉得非常好,在此mark一下。感觉Sun的东西才是王道!英文版的资料更加好!


JAXP的演进

作者:Rahul Srivastava

Rahul Srivastava;SJTUer
原文地址:http://www.xml.com/pub/a/2005/07/06/jaxp.html
中文地址:http://www.matrix.org.cn/resource/article/43/43893_JAXP.html
关键词: JAXP XML


简介
在1998年W3CXML1.0推荐标准发布之后,XML就开始变得很流行。Sun公司就是在那时候规范Java Community Process (JCP),同时JAXP(JSR-05)的第一版在2000早些时候发布了。这个版本得到了很多工业集团的支持,譬如(以年月次序排列)BEA Systems, Fujitsu Limited, Hewlett-Packard, IBM, Netscape Communications, Oracle, and Sun Microsystems, Inc.

JAXP (全称Java API for XML Parsing)的可插拔性(pluggability)在开发社区里引起很大的轰动。这点也是JAXP的精华所在。开发人员可以编写自己的xml处理器,只要它符合JAXP的APIs,这样底层不同的xml处理器可以任意切换而不用改应用程序的代码。

那JAXP到底是什么呢?首先 这个P有点迷惑,它代表Parsing还是Processing呢?
因为JAXP1.0的时候只支持解析(parsing),所以JAXP全称应该是Java API for XML Parsing.
但在JAXP1.1的时候,XSL-T被推荐用作XML的转换(transformation)处理。很遗憾,当时W3C XLT-T的标准规范(specification)里没有提供任何用来转换(transformation)处理的APIs。因此JAXP1.1的专家组推荐了一组APIs叫Transformation API for XML (TrAX)。
从此JAXP就叫Java API for XML Processing. JAXP通过逐步进化,支持的东西也越来越多
不仅仅是解析xml文件(譬如在解析文档的时候根据schema校验有效性,根据预解析的schema来校验文档有效性,计算XPath 表达式等等)。

由于底层用来处理xml文档的可插拔的processor是任意编写的,只要它符合JAXP的规范,因此JAXP 是一个轻量级的处理xml文件的处理APIs。(译者注:JAXP只是一个api规范而已,真正底层实现是任意的。后面会有具体介绍。)

使用JAXP来解析XML文档
JAXP支持基于对象和基于事件的两种解析方式。基于对象的解析,到目前为止只支持W3C DOM解析,JAXP的专家组可能在JAXP的将来版本中会支持J-DOM规范。基于事件的解析,只有SAX 解析模式被支持,另一个基于事件的解析模式叫Pull Parsing,本来它应该是JAXP的一部分。但是对于Pull Parsing存在有一份不同的JSR (#173)文档,也就是大家所知道的Streaming API for XML (StAX) parsing,现在我们对于那个也没什么更多的可以做了。

image
Figure 1: Various mechanism of parsing XML

使用SAX来解析XML文档
SAX APIs 是在1998年的早些时候由David Megginson提出的,目标是成为基于事件驱动的xml文档解析模式的标准API(这里你可以的到一些 SAX 的历史信息)。即使这样,SAX仍不是W3C 的REC。但毫无疑问实际中它是行业内解析XML文档的标准。

SAX 是一种基于事件的解析模式,是push-parsing原理,解析文档的时候,当遇到<opening> 标签, </closing>标签 或字符等,SAX 都会产生相应的事件(event)。一个SAX解析器解析XML文档的时候,把文档看作为一个流,依次产生相应的事件报告给已注册的content handler, org.xml.sax.ContentHandler,如果有错误,错误会报告给error handler, org.xml.sax.ErrorHandler.

如果你不注册一个error handler,那你就根本不会知道在解析XML文档的时候有没有错误产生和错误是什么。因此,在SAX解析XML文档的时候注册一个error handler是极其重要的。

如果程序需要知道有什么事件产生了(并且想处理此事件),那你必须实现org.xml.sax.ContentHandler 接口并注册给 SAX解析器。一个典型的事件被触发的顺序是
startDocument, startElement, characters, endElement, endDocument。
startDocument 仅仅被触发一次而且是在触发其它event之前。同样,endDocument仅仅被触发一次而且是在整个文档被成功解析之后。你可以从SAX javadocs中获取更详细的信息。

image
Figure 2: SAX Parsing XML

使用JAXP,通过SAX parse XML document的代码片断:
1 SAXParserFactory spfactory = SAXParserFactory.newInstance();
2 spfactory.setNamespaceAware(true);
3 SAXParser saxparser = spfactory.newSAXParser();
4
5 //write your handler for processing events and handling error
6 DefaultHandler handler = new MyHandler();
7
8 //parse the XML and report events and errors (if any) to the handler
9 saxparser.parse(new File("data.xml"), handler);

文档对象模型解析
DOM 解析是基于对象的原理,当用DOM解析XML文档时它会在内存中生成一个树形的结构来表示一个XML文档。树上的每个节点代表着XML文档中的一个节点。如果一个DOM解析器符合W3C标准,那它产生的DOM就是W3C的DOM,使用org.w3c.dom APIs就能遍历和修改这个DOM。

大部分DOM解析器允许你抽取XML文档里的一部分来生成DOM树,而不是把整个XML文档在内存中建立对应DOM树。

image
Figure 3: DOM Parsing XML


使用JAXP, 通过DOM parse XML document的代码片断:
1 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
2 dbfactory.setNamespaceAware(true);
3 DocumentBuilder domparser = dbfactory.newDocumentBuilder();
4
5 //parse the XML and create the DOM
6 Document doc = domparser.parse(new File("data.xml"));
7
8 //to create a new DOM from scratch -
9 //Document doc = domparser.newDocument();
10
11 //once you have the Document handle, then you can use
12 //the org.w3c.dom.* APIs to traverse or modify the DOM

在校验模式下进行解析
根据DTD校验
DTD 是XML 文档的语法。经常人们会觉得DTD有点另类,因为它和XML的syntax不一样,但DTD是W3C XML1.0里的完整的一部分。如果一份XML文档声明了DOCTYPE,并且想在解析的时候根据DTD校验文档,那你必须在适当的factory里启用根据DTD校验文档(validation)这个特性。例如:
1 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
2 dbfactory.setValidating(true);
3
4 OR
5
6 SAXParserFactory spfactory = SAXParserFactory.newInstance();
7 spfactory.setValidating(true);
8

注意,如果XML文档声明了一个DTD ,即使你不启用校验(validation)这个特性,解析器总是试着去读入这个DTD。 这样做的目的是为了保证XML文档中entity reference被正确的扩展了,否则会导致格式不正确的XML文档,只有在XML文档序言部分的声明中standalone属性被置为true时,外部的DTD才会被完全忽略掉。例如:
1<?xml version="1.1" encoding="UTF-8" standalone="yes"?>

根据W3C Schema来校验XML文档(WXS)
XMLSchema 是XML文档的另外一种文法描述。XMLSchema非常流行市因为它和XML文档使用同样的语法并且提供了丰富的定义校验限制的特性。如果一个XML文档用"schemaLocation" 和"noNamespaceSchemaLocation"指向了一个schema,结下来你想启用根据XMLSchema校验文档这个特性,你还要做如下的步骤:
1.和上面说的一样,调用SAXParserFactory o或DocumentBuilderFactory的setValidating函数来启用validation这个特性。
2.把属性 "http://java.sun.com/xml/jaxp/properties/schemaLanguage" 值设为 "http://www.w3.org/2001/XMLSchema"

注意,这种情况下,即使XML文档有DOCTYPE声明,处理器仍不会用DTD来校验这个文档。但是和前面提到的一样,为了任何一个entity reference是被正确扩展的,这个DTD还是会被装载的,
既然"schemaLocation" 和"noNamespaceSchemaLocation"仅仅是提示,所以可以使用属性"http://java.sun.com/xml/jaxp/properties/schemaSource"从外部提供schemas来覆盖这些提示。
对于这个属性,一些可以接受值是:

·是一个代表schema的URL地址的字符串。
·java.io.InputStream with the contents of the schema
·org.xml.sax.InputSource
·java.io.File
·一个 java.lang.Object 的数组,数组内容是上面所提到三类中的一个。
例如:
1 SAXParserFactory spfactory = SAXParserFactory.newInstance();
2 spfactory.setNamespaceAware(true);
3
4 //turn the validation on
5 spfactory.setValidating(true);
6
7 //set the validation to be against WXS
8 saxparser.setProperty("http://java.sun.com/xml/jaxp/properties/
9 schemaLanguage", "http://www.w3.org/2001/XMLSchema");
10
11 //set the schema against which the validation is to be done
12 saxparser.setProperty("http://java.sun.com/xml/jaxp/properties/
13 schemaSource", new File("myschema.xsd"));

使用JAXP的TrAX APIs来进行XML文档转换处理工作
W3C XSL-T 定义了一些转换规则来把源树转化生成结果树。在XSL-T中,转换信息所存在的文件叫样式表(stylesheet)。要用JAXP来转换一个XML文档,你需要定义一个使用样式表来转换XML文档的转换器。创建好这样的转换器后,它把要转换的XML文档作为JAXP的source,返回转换好的结果作为JAXP的result。目前JAXP提供三种类型的source和result:
StreamSource, SAXSource, DOMSource and StreamResult, SAXResult, DOMResult, 他们是能够联合使用的。

image
Figure4: XML Transformation

从DOM中生成SAX Events:
1 //parse the XML file to a W3C DOM
2 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
3 dbfactory.setNamespaceAware(true);
4
5 DocumentBuilder domparser = dbfactory.newDocumentBuilder();
6 Document doc = domparser.parse(new File("data.xml"));
7
8 //prepare the DOM source
9 Source xmlsource = new DOMSource(doc);
10
11 //create a content handler to handle the SAX events
12 ContentHandler handler = new MyHandler();
13
14 //prepare a SAX result using the content handler
15 Result result = new SAXResult(handler);
16
17 //create a transformer factory
18 TransformerFactory xfactory = TransformerFactory.newInstance();
19
20 //create a transformer
21 Transformer xformer = xfactory.newTransformer();
22
23 //transform to raise the SAX events from DOM
24 xformer.transform(xmlsource, result);

上面的例子中,我们创建Transformer的时候没有用到XSL。这意味着这个转换器对XML不会有任何的转换,source和result是一样的。当你实际相要用XSL来转换,你应该创建一个使用了XSL的转换器,就像下面一样:
1 //create the xsl source
2 Source xslsource = new StreamSource(new File("mystyle.xsl"));
3
4 //create the transformer using the xsl source
5 Transformer xformer = xfactory.newTransformer(xslsource);

JAXP1.3有哪些新特性?
除了支持SAX解析,DOM解析,根据DTD/ XMLSchema的校验,使用XSL-T转换,
和以前的版本相比JAXP1.3新支持的特性有:
1. XML 1.1 和XML 1.1名字空间
2. XML Inclusions - XInclude 1.0
3. 根据预解析的schema来校验文档。
4. XPath表达式的计算.
5. 以前XMLSchema 1.0, XPath 2.0 和XQuery 1.0中的某些数据类型不能被映射到java里的数据类型 ,现在可以了。

使用JAXP1.3
XML1.1主要支持的特性如下:
1.向前兼容不断增长的Unicode字符集。
2.在行结束(line-end)字符集中新添加了NEL (#x85)和Unicode行分隔符(#x2028)。

XML1.1中的变更不是向下兼容的,XML1.0中的一些well-formedness规则在
XML1.1中可能就不适用。所以XML1.1的规范是全新的而不是从XML1.0规范上升级。
为了能够使用XML1.1和XML1.1的名字空间,你必须在XML序言声明中把version属性的值设为“1.1”。例如:
1<?xml version="1.1" encoding="UTF-8" standalone="yes"?>

XInclude允许一个XML文档包含另一个XML文档,例如:
1 <myMainXMLDoc xmlns:xi="http://www.w3.org/2001/XInclude">
2 <xi:include href="fragment.xml"/>
3
4 </myMainXMLDoc>

相要使用XML inclusions特性,你必须在适当的factory里设置XInclude属性为true,就像下面代码所示:
1 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
2 dbfactory.setXIncludeAware(true);

根据预解析的schema校验JAXP的输入源

javax.xml.validation包提供了解析schema和根据预解析的schema校验XML文档的功能。DOMSource和SAXSource是可以根据预解析的schema来被校验。如果需要可以缓存预解析的schema来达到优化的目的。必须注意到的是,根据预解析的schema校验JAXP的输入源中,StreamSource并不是被支持的源,还有schema可以是W3C XML Schema 或者是一个OASIS RELAX-NG。例如:
1 //parse an XML in non-validating mode and create a DOMSource
2 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
3 dbfactory.setNamespaceAware(true);
4 dbfactory.setXIncludeAware(true);
5
6 DocumentBuilder parser = dbfactory.newDocumentBuilder();
7 Document doc = parser.parse(new File("data.xml"));
8
9 DOMSource xmlsource = new DOMSource(doc);
10
11 //create a SchemaFactory for loading W3C XML Schemas
12 SchemaFactory wxsfactory =
13 SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
14
15 //set the errorhandler for handling errors in schema itself
16 wxsfactory.setErrorHandler(schemaErrorHandler);
17
18 //load a W3C XML Schema
19 Schema schema = wxsfactory.newSchema(new File("myschema.xsd"));
20
21 // create a validator from the loaded schema
22 Validator validator = schema.newValidator();
23
24 //set the errorhandler for handling validation errors
25 validator.setErrorHandler(validationErrorHandler);
26
27 //validate the XML instance
28 validator.validate(xmlsource);

计算XPath表达式

javax.xml.xpath 包提供了根据XML文档计算XPath表达式的功能。如果一个表达式要被重用,出于性能考虑,这个XPath表达式会被编译。
顺便说一下,JAXP中的XPath 的API被设计为无状态的,这就意味着每次你要计算一个XPath表达式,你都要传入一个XML的文档。通常,很多XPath表达式是根据单个XML文档来计算的。这种情况下,如果JAXP中的XPath APIs是有状态的,XML文档只需传入一次,那样就更好了。对于底层实现来说就多了一个优化选择,可以把XML 文档源存储起来,这样就可以快速计算XPath表达式了。
一个根据XML文档计算XPath表达式得例子:
1 <?xml version="1.0"?>
2 <employees>
3 <employee>
4 <name>e1</name>
5 </employee>
6 <employee>
7 <name>e2</name>
8 </employee>
9 </employees>

1 //parse an XML to get a DOM to query
2 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
3 dbfactory.setNamespaceAware(true);
4 dbfactory.setXIncludeAware(true);
5
6 DocumentBuilder parser = dbfactory.newDocumentBuilder();
7 Document doc = parser.parse(new File("data.xml"));
8
9 //get an XPath processor
10 XPathFactory xpfactory = XPathFactory.newInstance();
11 XPath xpathprocessor = xpfactory.newXPath();
12
13 //set the namespace context for resolving prefixes of the Qnames
14 //to NS URI, if the xpath expresion uses Qnames. XPath expression
15 //would use Qnames if the XML document uses namespaces.
16 //xpathprocessor.setNamespaceContext(NamespaceContext nsContext);
17
18 //create XPath expressions
19 String xpath1 = "/employees/employee";
20 XPathExpression employeesXPath = xpathprocessor.compile(xpath1);
21
22 String xpath2 = "/employees/employee[1]";
23 XPathExpression employeeXPath = xpathprocessor.compile(xpath2);
24
25 String xpath3 = "/employees/employee[1]/name";
26 XPathExpression empnameXPath = xpathprocessor.compile(xpath3);
27
28 //execute the XPath expressions
29 System.out.println("XPath1="+xpath1);
30 NodeList employees = (NodeList)employeesXPath.evaluate(doc,
31 XPathConstants.NODESET);
32 for (int i=0; i<employees.getLength(); i++) {
33 System.out.println(employees.item(i).getTextContent());
34 }
35
36 System.out.println("XPath2="+xpath2);
37 Node employee = (Node)employeeXPath.evaluate(doc, XPathConstants.NODE);
38 System.out.println(employee.getTextContent());
39
40 System.out.println("XPath3="+xpath3);
41 String empname = empnameXPath.evaluate(doc);
42 System.out.println(empname);

XML和java数据类型间的映射
Datatypes 在XMLSchema1.0的时候就很流行了,被很多其他XML规范所应用,像 XPath,XQuery,WSDL等。大部分的数据类型可以映射到java的基本数据类型或包装过的数据类型。其他的类型如:dataTime,duration可以被映射到新的java数据类型: javax.xml.datatype.XMLGregorianCalendar, javax.xml.datatype.Duration, and javax.xml.namespace.QName. 这样XMLSchema1.0 XPath 2.0 和XQuery 1.0中所有数据类型,JAVA中都有对应的类型存在。

从可用性角度看,如果DatatypeFactory有方法能够生成一个对应WXS中数据类型的java对象,并且这个java对象拥有方法能根据facets限制数据类型和根据值来校验数据类型,这样就非常好了。
一个使用Oracle's XDK的例子:
1 import oracle.xml.parser.schema.*;
2 . . .
3
4 //create a simpleType object
5 XSDSimpleType st = XSDSimpleType.getPrimitiveType(XSDSimpleType.iSTRING);
6
7 //set a constraining facet on the simpleType
8 st.setFacet(XSDSimpleType.LENGTH, "5");
9
10 //validate value
11 st.validateValue("hello");

底层实现间的切换
一个JAXP的实现通常包括一个默认的解析器,转换器,xpath引擎和schema校验器,
但是就像文章开始的时候所提到的那样,JAXP是一个可插拔的API,我们可以插入我们自己的处理器来替换JAXP默认的处理器。要实现这样的切换,我们可以通过设置属性javax.xml.xxx.yyyFactory的值来指定一个合格的factory的实现类。当yyyFactory.newInstance()被调用的时候,JAXP使用如下的顺序查找需要装载的具体的实现类:

1.使用javax.xml.xxx.yyyFactory属性指定的值.
2.使用 JRE 目录下lib/jaxp.properties 属性文件。Jaxp.properties文件只被读入一次,它的值会被缓存已被将来所用。如果第一次尝试去读这个文件而此文件不存在的话,以后就不会尝试着去检查此文件是否存在。jaxp.properties里面的值第一次读过之后,就不可能被修改了。
3.如果可以地话,可以使用Services API(在JAR的规范里有详细的信息)来决定哪个实现类被载入。Services API会在runtime时存在的jars的META-INF/services/javax.xml.xxx.yyyFactory里寻找那个classname。
4.使用平台默认的javax.xml.xxx.yyyFactory 实例。
javax.xml.xxx.yyyFactory 可是下面其中的一个:
javax.xml.parsers.SAXParserFactory
javax.xml.parsers.DocumentBuilderFactory
javax.xml.transform.TransformerFactory
javax.xml.xpath.XPathFactory
javax.xml.validation.SchemaFactory:schemaLanguage (schemaLanguage 是调用SchemaFactory的newInstance函数时所提供的参数)

例如:想在JAXP中使用SAX解析器,你可以用上面提到的4个方法中的任何一个把
javax.xml.parsers.SAXParserFactory设为org.apache.xerces.jaxp.SAXParserFactoryImpl。
其中的一个方法如下:
1 java -Djavax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImpl MyApplicationProgram
5、Java EE 与 EJB 技术:从旧世界到新世界的探索 本文深入探讨了 Java EE 平台中的关键技术,包括连接器、XML 解析与绑定、安全服务等,并详细介绍了 EJB 技术在 3.0 版本之前的编程和部署模型。通过示例代码和流程图,展示了前 EJB 3.0 的复杂性及其优缺点,同时展望了改进方向,如简化编程模型和优化部署过程。最后总结了技术演进的重要性及未来发展方向。 阅读详情

相关推荐

掌握dom4j:Java XML处理库详解与实战

DOM4J 是一个功能强大且易于使用的 Java XML API,它提供了对 XML、XHTML 和 XPath 的支持。本章节将介绍如何使用 DOM4J 进行 XML 文档的解析与处理。本章介绍了DOM4J在XML文档读取和解析方面的灵活易用的API设计。我们探讨了解析器的选择、DOM的构建以及如何利用DOM4J创建和修改XML文档。此外,还学习了遍历和查询XML文档的方法,并演示了如何格式化输出XML数据。在下一章中,我们将深入探讨性能优化以及DOM4J的版本演进。

weixin_42315569的博客 929

sax解析xml,验证格式并支持自定义标签

一、sax简介   SAX是事件驱动型的XML解析方式。顺序读取XML文件,生成事件,传播到用户定义的回调方法中来处理XML文件。   优点:     分段处理xml,而不是将整个xml一次加载进内存,内存占用少,速度快。   缺点:     顺序访问,不能回退。编码复杂,需要用户把控数据结构。 二、使用流程   1.创建工厂 SAXParserFactory saxPa...

weixin_30826095的博客 491

Oracle 10g中的XML处理与HTML-DB开发环境

本篇博文详细介绍了如何在Oracle 10g中进行XML数据的编码、处理和转换,以及使用HTML-DB开发环境来创建基于HTML的应用程序。内容涵盖了编码认证、servlet的安装和配置、以及Oracle提供的丰富工具包XDK的组件和功能。同时,介绍了HTML-DB的基本概念、架构和功能,以及如何利用它来快速开发和部署应用程序。

weixin_32098457的博客 709

java中的xml解析时jaxp.properties文件问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34295316的博客 961

面向对象的XML转换:利用DOM4J与Java反射技术

XML(Extensible Markup Language)是一种用于描述和交换数据的标记语言,它允许开发者定义自己的标签和结构,这使得XML在IT行业中具有广泛的应用。XML的自定义性、层次性和文本性使得它在数据交换、系统配置、元数据描述等多个领域都发挥着重要作用。DOM4J库是一个轻量级的、易于使用的Java库,支持XML的读取、修改、创建和序列化操作。它提供了多种接口和类来操作XML文档,包括DOM、SAX和JAXP。DOM4J的核心功能包括:支持DOM1、DOM2和JAXP的解析接口。

weixin_42593701的博客 886

深入理解Java服务加载器机制:SPI设计模式实战解析

假设我们有一个日志服务接口:并在文件中注册两个实现类:我们可以这样使用来加载它们:执行结果会依次输出两个实现的日志信息,表明服务已被成功发现并实例化。

weixin_35516273的博客 887

JAXP的演进(Rahul Srivastava)

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明作者:Rahul Srivastava;SJTUer原文地址:http://www.xml.com/pub/a/2005/07/06/jaxp.html中文地址:http://www.matrix.org.cn/resource/article/43/43893_JAXP.html关键词: JAXP XML简介在19

IT is Alex.Net 1186

麒麟V10桌面操作系统安装Qt5.12.3

在虚拟机中如何安装麒麟V10桌面系统,以及在麒麟系统中安装Qt框架,并正常编译运行Qt程序

阿龙的思考 3599

XML验证实践(DTD和Schema)

DTD验证方案:   XML文档:Employee.xml         xml version = "1.0" ?>         DOCTYPE Employee SYSTEM "Employee.dtd">         Employee>                  Emp_Id> E-001 Emp_Id>

八荒六合唯我独尊 3579

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4837

jasperreports导出报表报错:org.xml.sax.SAXException: http://java.sun.com/xml/jaxp/properties/schemaSource

15:26:07,213  INFO CommonJasperPrintJRXML:187 - 生成临时报表文件:/IDB/download\20140820\DataGridReport_3d8bcd72-e5e4-4a55-8f9a-aadb5aa6545b.jrxml 15:26:07,214  INFO JasperPrintUtil:462 - 2、编译Jasper报表文件:DataG

会开车的野人的专栏 2879

Neo4j LLM知识图谱构建器使用教程

是一个开源应用程序,旨在将非结构化数据(如PDF、文档、文本、YouTube视频、网页等)转换为存储在Neo4j中的知识图谱。该项目利用大型语言模型(如OpenAI、Gemini等)从文本中提取节点、关系及其属性,并通过Langchain框架创建结构化的知识图谱。

u013250861的博客 540

Java API for XML Parsing(JAXP)演进

 http://www.syue.com/Java/HTML/75888.html简介    在1998年W3CXML1.0推荐标准发布之后,XML就开始变得很流行。Sun公司就是在那时候规范Java Community Process (JCP),同时JAXP(JSR-05)的第一版在2000早些时候发布了。这个版本得到了很多工业集团的支持,譬如(以年月次序排列)BEA Systems, F

燕窝 1290

【数据集】全球湿度数据集总结

【数据集】全球湿度数据集总结

WW、forever的博客 1661

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4964

JAXP的演进(转)

  原文作者: Rahul Srivastava 原文地址:http://www.xml.com/pub/a/2005/07/06/jaxp.html 中文地址:http://www.matrix.org.cn/resource/article/43/43893_JAXP.html 简介 在1998年W3CXML1.0推荐标准发布之后,XML就开始变得很流行。Sun公司就是在...

大音希声 大象无形 194

2026华为OD机考新系统真题 + 双机位C卷 + 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2026年4月1日起,华为OD机试正式切换至新系统模式!采用力扣模式,无需自己写输入! 难度大幅度降低。正在备考华为OD机试的同学,优先刷新系统机试真题,可大幅提升通过率。 新系统考题考点与旧版一致,无需重新适应。本专栏所有算法题均配有详细思路解析,并提供C语言、JS、C++、Python、Go、Java多语言源码实现。订阅后私信即可开通专属OJ刷题权限,高效备考一次上岸!

算法大师! 45万+

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4161

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...

XML解析1--里程

1、XML解析器作用:   xml文档 ——> 解析器——>用户(开发者)关注的数据信息 2、XML解析器的发展历程:一个典型的 抽象-再抽象的过程 2.1不同的厂商提供了不同的解析器(即提供解析功能的类库)   优点:用户(开发者)不用再自己来分析XML文档格式,便可以获取关注的信息数据   缺点:如果不同的开发商开发的XML解析器提供的API都不一样,那么应用程...

aimee628006的博客 118

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java:实现读取XML配置文件(附带源码)

java:实现读取XML配置文件(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 748

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 简介: 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML 定义的 Bean 信息转换为 Spring 框架的 Bean Definition 对象的处理过程,向读者展示了 Spring 框架的奥妙之处,可以加深开发人员对 Sprin

远有青山 1821

XML解析器的进化论:从XXE漏洞看编程语言安全设计变迁

本文深入探讨了XML解析器在安全设计上的演进历程,重点分析了XXE漏洞的成因及防御策略。通过对比Java、PHP、Python等主流编程语言的XML处理机制改进,揭示了从默认风险配置到现代安全实践的关键转变,为开发者提供了防范XXE攻击的最佳实践方案。

weixin_29315091的博客 217

Java XML解析器XXE漏洞四维排查与修复实战

XML外部实体注入(XXE)是一种由解析器默认行为引发的基础性安全风险,其原理在于XML处理器在未显式禁用外部实体时,会主动加载并解析DOCTYPE中声明的远程或本地资源。该漏洞不依赖业务逻辑缺陷,而根植于JDK版本差异、框架封装层(如Spring Boot)、容器配置(如WebLogic)及第三方库(如Xerces)构成的技术栈组合。技术价值体现在可导致敏感文件读取、内网端口探测、DNS带外回传等高危后果,广泛影响政务系统、医疗平台、IoT设备管理等XML高频使用场景。本文聚焦Java生态,结合解析器行为

weixin_30496999的博客 313

# JSR 67:Java™ APIs for XML Messaging 1.0(JAXM 1.0)完整解析

**JSR 67** = **JAXM 1.0(Java API for XML Messaging)**,是JCP(Java社区进程)发布的Java标准规范,全称`Java™ APIs for XML Messaging 1.0`,专门为Java平台定义**基于SOAP的XML消息收发标准API**,是早期Java Web服务体系的核心组件之一。 - 规范状态:Final(正式定稿发布) - 绑定协议:SOAP 1.1 + MIME附件规范(SAAJ) - 归属时代:J2EE 1.3/1.4 时期标准,现

[Blog][Domain] programb.blog.youkuaiyun.com 671
上一篇: xml命名空间的URI
下一篇: sax与Dom区别
shellfj
博客等级 码龄23年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值