看来对于XML的认知是不断加深的过程~ 本篇简介XML解析的方式以及使用Jaxp对XML文档进行dom解析。 【XML解析】 对于XML解析方式,有DOM文档对象模型和SAX两种。 现在已经有很多开发包来帮助我们对XML进行解析,比如sun公司的Jaxp,它由org.w3c.dom、 org.xml.sax、javax.xml 等开发包组成。 也有后来从Jdom分支出去的团队开发的dom4j,dom4j在实践中使用较多,下篇博客会做简要介绍,看官不要错过~ 【Jaxp对XML文档进行DOM解析】 在Jaxp和dom4j之间,前者是sun公司的标准,后者则是实际开发中比较常用的开发包。
–document –element –commment –attribute –text branch –document –element jaxp 也就是说它把说有对象都单独分离出来看成一个对象,而branch是一个对经常使用节点的封装和关联,如Element对象就包括了有attribute对象和text对象,而document对象就封装了全部节点对象 jaxp 的dom解析 jaxp的dom解析方式没有branch节点,没有将各个节点进行封装,全部操作的都是node节点; 并且由于节点间没有关联属性,所以在创建节点后须要进行关联,删除节点时须要找父节点 细节:node的节点没有获得attribute的方法,仅仅有Element才有获得attribute的方法 dom4j解析,jaxp的dom解析的共同点 1.通过依据条件查询后的结果都是一个list 集合 2.改动text或textContent时既能够用Node也能够用Element xml文档解析方式有两种dom和sax,经常使用开发工具有两种jaxp,dom4j jaxp:将两种解析方法分开了
JAXP(Java AOI for XML Processing):是 SUN 公司推出的解析标准实现。 Dom4J:是开源组织推出的解析开发包。 2.1 JAXP-DOM解析 解析的逻辑同Python中差不多,如果了解其中一种语言,其他语言基本上可以去看下。 在JDK中,可以在rt.jar包中找到解析方法。
xml解析开发包有:Jaxp(最差)、Jdom(一般)、dom4j(最好)。 JAXP: 定义一个xml文档: <?xml version="1.0" encoding="UTF-8"? javaScript网页开发</书名> <作者>张孝祥</作者> <售价>109元</售价> <售价>28.00元</售价> </书> </书架> Jaxp
2 JAXP-Sax解析XML是一种通用的数据交换格式,它的平台无关,语言无关,系统无关,在不同的语言环境的解析方式都是一样的,只不过是实现的语法不同。
XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。
JavaXML相关API 是由JAXP定义了相关的XML的通用接口,常见包括DOM/SAX/STAX/XPATH 的标准API Javax.xml.parsers -> DOM/SAX Javax.xml.stream 项目 openJDK的子项目,目录在http://hg.openjdk.java.net/jdk8u/jdk8u/jaxp/该项目编译进jar/lib/rt.jar 主要包含DOM/SAX/STAX/ XPATH 如何确定加载哪个解析器 JAXP 1. 校验JRE/lib/jaxp.properties的参数 3. SPI检查 META-INF/service/ 参数 4. 除了WebService 大部分都使用JAXP的API 由于考虑到使用场景和第三方库非常多,我们可以分别对JAXP 和 JAXWS进行分别防御 如何防御XXE 常见JAXP 的XXE防御 我们会在获取解析器的时候设置参数
将 StAX 与其他 JAXP API 进行比较 作为 JAXP 家族中的一个 API,StAX 可以与 SAX、TrAX 和 JDOM 等其他 API 进行比较。 例如,在jaxp.properties中设置javax.xml.accessExternalDTD=""将指示 JAXP 处理器拒绝任何外部连接。 通过 JAXP 工厂或SAXParser指定的 JAXP 属性优先于系统属性,jaxp.properties文件以及javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING 通过 JAXP 工厂或SAXParser指定的 JAXP 属性优先于系统属性,jaxp.properties文件以及FEATURE_SECURE_PROCESSING。 使用 jaxp.properties 文件 jaxp.properties 文件是一个配置文件。
在Jave SE中JAXP对应javax.xml.parsers包,DOM对应org.w3c.dom,SAX对应org.xml.sax。 JDOM和DOM4J,是因为有人觉得W3C的DOM标准API太过难用而着手开发的替代API,它们和JAXP一样都是对DOM、SAX的封装,不过JDOM、DOM4J做了更多的事情,相当于上面提到JAXP接口 (参考: 使用 SAX 处理 XML 文档 和 DOM SAX JAXP DOM4J JDOM xerces解析器) Android中解析XML实现 基于上面的分析,采用JAXP+SAX的方案是我比较看好的 包,SAX对应的org.xml.sax,DOM对应的org.w3c.dom包,所以我们就已经有了XML解析所需的JAXP——对SAX和DOM的封装(抽象类)以及SAX和DOM接口类,但是对于JAXP抽象类的实现 它采用了类似JAXP的工厂模式,把接口设计和实现分离,KXML2就是一个为J2ME环境优化的一个实现。
如题,错误如下:javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
DocumentBuilderFactory.class, "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl = null) { if (attributes.containsKey(JAXPConstants.JAXP_SCHEMA_LANGUAGE)) { SAXMessageFormatter.formatMessage(null, "schema-already-specified", new Object[] {JAXPConstants.JAXP_SCHEMA_LANGUAGE })); } else if (attributes.containsKey(JAXPConstants.JAXP_SCHEMA_SOURCE)) { SAXMessageFormatter.formatMessage(null, "schema-already-specified", new Object[] {JAXPConstants.JAXP_SCHEMA_SOURCE
这一系列示例将通过一个名为DOMEcho的示例程序展示 DOM 的内部结构,您可以在安装了 JAXP API 后在目录*INSTALL_DIR*/jaxp-*version*/samples/dom中找到它 static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; 本节的其余部分描述了组成 JAXP 转换 API 的包。 JAXP 转换包 这里是组成 JAXP 转换 API 的包的描述: javax.xml.transform 该包定义了您用于获取Transformer对象的工厂类。
JAXP: 由sun公司推出的解析标准实现(本章只学习该包的解析方法) Dom4j: 一种开源的解析开发包. jaxp是java api中自带的一个包,而dom4j需要我们加入jar文件才能使用 2 .JAXP使用 JAXP(Java API for XMLProcessing)主要由下面几个包组成: org.w3c.dom: 定义DOM解析器的标准接口 org.w3c.sax: 定义SAX解析器的标准接口 3.使用JAXP进行DOM解析 会将XML文档全部内容都读入内存中,并且将文档里的每个数据都创建为一个个对象,所以方便增删改.并且遍历简单。 new StreamResult("src//persons.xml"); transformer.transform(xmlSource, outputTarget); } 4.使用JAXP
(text); Styling a Document with XSLT Applying XSLT on a Document is quite straightforward using the JAXP Here is an example of using JAXP to create a transformer and then applying it to a Document. document, String stylesheet ) throws Exception { // load the transformer using JAXP
<init>(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl. <init>(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown
准确的来说,Java XML功能包含了JAXP规范,而Java中自带的JAXP实现使用了Apache Xerces和Apache Xalan,Apache Xalan又依赖了BCEL,所以BCEL也被放入了标准库中 JAXP全名是Java API for XML Processing,他是Java定义的一系列接口,用于处理XML相关的逻辑,包括DOM、SAX、StAX、XSLT等。 其实Java里很多东西是有因果的,TemplatesImpl是对JAXP标准中javax.xml.transform.Templates接口的实现,前文说了,XSLT在使用时会先编译成Java字节码,这也就是为什么 参考链接: https://docs.oracle.com/javase/tutorial/jaxp/index.html https://kingx.me/Exploit-FastJson-Without-Reverse-Connect.html
(DOMParser.java:140(Compiled Code)) at weblogic/apache/xerces/jaxp/DocumentBuilderImpl. (DocumentBuilderImpl.java:103(Compiled Code)) at weblogic/apache/xerces/jaxp/DocumentBuilderFactoryImpl.setAttribute (DocumentBuilderFactoryImpl.java:126(Compiled Code)) at weblogic/xml/jaxp/WebLogicDocumentBuilderFactory (RegistryDocumentBuilder.java:283(Compiled Code)) at weblogic/xml/jaxp/RegistryDocumentBuilder.getDocumentBuilder (RegistryDocumentBuilder.java:222(Compiled Code)) at weblogic/xml/jaxp/RegistryDocumentBuilder.parse
TestCase时,可能需要加上两个jvm参数: -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
首先我们将 “通过父类加载器加载一个在子类加载器管辖类来源的类” 具体化为 “在一个由Bootstrap ClassLoader加载的类中动态加载其他目录路径下的类库”,这样我们就轻松地找到JNDI、JAXP 以下就以JAXP来介绍吧! 现在以 javax.xml.parsers.DocumentBuilderFactory.newInstance(" org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 首先假设newInstance内部是以以下方式加载类的 Class.forName("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"); // 或 还记得 ClassLoader.getSystemClassLoader().loadClass("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl")
5、Java中的XML解析 在Java中,我们可以使用一组流程化的API对XML数据进行解析,这组API就是JAXP(Java API for XML Processing)。 JAXP提供了一系列的接口,包括Document、Element、Text等,可以方便地对XML文件进行解析和处理。此外,还有一些开源的解析器,如Xerces和DOM4J等。