假期结束,开始收心回来继续工作。晚上有一个项目要发布,公司的同事突然打手机给我,说ASF的文件解析又出了上次的问题,希望尽快解决。
问题描述: 上一次问题:
多台机器运行同一个分支的应用,但是有些机器正常,有一台机器始终在启动的时候报文件解析错误,从提示看来,主要是因为解析配置文件的时候校验dtd失效,这台机器无法连接外网。最后降低了我们内部的核心解析包,问题解决(或者让这台机器连接到外网)。(当时由于自己手头工作比较多,也没有在意,既然解决了就随之过去了)
此次问题:
问题的提示和上次的类似,不过这次的机器时连接外网的。
问题查找: 解析出错的文件是ASF(SCA的服务框架)的组件配置文件(composite文件),格式为xml的格式,解析方式是通过StAX标准来实现的。
按照上一次的解决方法,我将内部的tuscany0.998降级到tuscany0.997,解析正常。看了一下我对于这两个版本升级作的修改,主要是支持了SCA框架中的Spring配置文件能够使用import的标签,内签多个标准的spring文件。
跟踪代码内部发现,果然是在解析某几个spring的配置文件时出现了问题,比较了一下ASF的Spring(正常解析)和标准的Spring配置文件,差别主要是在关于Xml的校验申明的区别。ASF的Spring配置文件是由ASF Spring插件来自己解析的(采用Schema申明(固定的Target namingspace),因此早先所有的ASF的Spring我都要求大家采用Schema的校验申明),而对于原来不是ASF的spring都是采用dtd的校验方式申明(互相拷贝导致都是这样)。下面就是两种申明:
Schema:
<beans
xmlns="http://www.springframework.org/schema/beans" xmlns:sca="http://www.springframework.org/schema/sca" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/sca http://www.springframework.org/schema/sca/spring-sca.xsd"> Dtd:
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd"> 早先由于在0.997版本中没有支持import,因此也就不会去解析那些不是ASF的Spring文件,而现在因为需求支持了import所以需要解析那些原来不属于ASF的Spring的配置文件。因此降低版本不是解决问题的办法。
进一步跟进问题,发现是在解析Dtd的申明时候出现问题,抛出异常说连接超时。通过IE访问了一下dtd的地址,的却也是有问题,无法连接。看来是Spring的dtd的服务器出现了问题,导致了我们解析文件时候校验无法正常,最终无法正常启动。
问题解决: 这里先说一下最后解决的几个方案,后面会有一些详细的解释和说明。
1. 升级ASF的Spring插件包,去除对于Xml的格式校验。
XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); //add by wenchu.cenwc cancel support dtd checkxmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, "false"); 2. 将Dtd的校验申明修改成为Schema的校验申明。
3. 建立公司的Xml校验服务器,控制管理dtd或者schema,将所有的xml Schema或者dtd申明指向该服务器。
问题延伸开来的思考:就问题的解决方案来看这个问题的一些值得注意和思考的地方。
方案1:
当前对于XML解析来说,各种框架都已经统一的实现了StAX的标准,同时在jdk6得rt.jar中都已经将StAX API作为基础框架API纳入其内。而通常情况下,如果不配置是否校验Xml,那么都将默认会主动校验Xml,此时就会出现上面我所遇到的问题,如果当你依赖的Xml DTD 或者 Schema服务器出现问题,就会导致你本地应用可能受到影响。在Dtd的申明说明中,<!DOCTYPE rootElement PUBLIC
"PublicIdentifier" "URIreference">红色部分说可以在网络出现问题或者网络速度很慢的时候被部分xml解析器替代URIreference使用,不过我这边没有成功过。我通过自己屏蔽网络连接来模拟环境的情况,都是无法通过的。(Schema比较奇怪,就算无法连接网络还是可以正常的,这个后续需要继续研究看看,或者有朋友对这个问题有了解请告知一下)
方案2:
其实早在2002年就已经有将dtd替换成为schema的趋势了,两者的区别和优劣网上的文章介绍了很多了,这儿不再罗列,其实最更本一点就是schema就是用xml来校验xml,而dtd却采用了另一套规则来校验xml,其本身也是xml,扩展性,可读性,学习曲线等等都次与schema。除了遗留系统,我个人看不出还有什么必要去使用老的dtd来校验xml的格式。Spring的dtd服务的出现问题,也说明了其实对于dtd这种方式的校验,spring也已经不会保证几个9的稳定性。
Xml常常会被作为数据承载中介,使双方能够在跨平台跨语言的情况下松耦合的交互信息,也是现在的SOA的实施基础。那么双方势必需要有协议和数据格式规范来约束,schema作为dtd的新一代替代者已经广为使用。另一方面,xsd也早已独立于wsdl作为数据描述和可重用的数据描述说明被采用到各种互联网应用。
看看国外的Facebook,亚马逊,ebay等公司的REST风格的API,就可以清楚地了解到xsd十分适合作为轻量级的数据交互协议。在后续ASF中融入REST配置的实现中,也需要采用XSD这种Schema描述来实现数据交互解析。
因此替换掉Dtd的配置是迟早要做的一件事情,所以迟作不如早作,更避免拷贝引起的问题放大效果(不过这个问题由于要考虑QA和业务组的项目经理的顾虑,因此我只能做到的是建议)。
方案3:
看看Maven这些年这么火,其实在我们自己公司内部的antx同样都是在做一件事情,就是对于第三方的依赖包的版本控制。对于开源项目依赖的管理其实很重要,作的好项目能够很好的利用已有的成果,管理的不好就会被一些不太稳定的开源项目搞得头破血流。
记得在上次三亚的聚会上谈到了对于Tuscany的依赖,其实对于这个项目来说,如果要作为成熟的产品来说,那么势必要获取一个版本然后就作为稳定的依赖,而不是一味的升级更新,由于我们产品的特殊性以及早期的Tuscany的不成熟,因此我们仅仅只是使用了Tuscany的最核心解析文件框架部分,其他的插件都采取自己设计或者在原有设计上优化和更新的做法。当然这不是说对于所有的第三方依赖都是采取这样的策略,其实如果不是基础框架设计,仅仅只是应用级别的使用,只需要拿来主义就完全可以了。
回过头来看,大家现在对于类库的管理已经都很重视了,但是对于配置性的或者数据格式类的文件还没有引起足够的重视,不过看到很多朋友已经在本地作了这样的工作,不过就我来看,如果能够对dtd,schema作版本控制和服务器搭建,在长远来看还是有一定的好处的,只是说根据各自的需求来做这样的工作。
后续 问题出现的当天,我其实晚上就一直比较担心,因为如果问题不解决,那么将会影响到很多项目组(框架被使用的越广泛,自己所要承担的责任越重大)。其实也是由于自己上次对于这个问题的不上心,导致了问题的再次出现。刨根问底是件好事,做我们这行的还是需要多问一些为什么,这样就会少不少危急时刻的怎么办了。
很多时候为什么程序员自己喜欢什么都自己做,因为掌握在自己手中的事情总是能够解决,但是现在项目中对于第三方的依赖越来越多,在选择和控制上必须慎之又慎,有时候依赖也是双刃剑。
分享到:
相关推荐
本文将深入探讨如何使用Castor解析XML,并通过XSD(XML Schema Definition)进行XML校验。 ### Castor XML解析 1. **安装与配置**:首先,你需要在项目中引入Castor的依赖库。如果你使用的是Maven,可以在pom.xml...
特别是当XML文档被用于不同系统之间的数据交换时,校验可以避免因格式错误而导致的数据丢失或解析失败。 #### 三、W3C XML校验工具介绍 W3C提供了一款强大的在线XML校验工具,它支持多种校验方式,包括: - **DTD...
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...
当有大批量xml文件但是里面有极个别xml错误时, 可以使用该工具, 检查某个文件夹下所有xml文件是否正确, 对检查结果进行输出 (只会检查一层文件, 即A文件夹下有xml文件和B文件夹, 则选中A文件夹不会检查B文件夹下的...
在本文中,我们将深入探讨如何在STM32F107上使用minixml库解析XML(可扩展标记语言)文档,这对于那些初次尝试在嵌入式环境中处理XML数据的开发者来说,是非常有价值的。 XML是一种通用的数据交换格式,它允许结构...
JavaScript中的XML解析器是用于处理XML数据的关键工具,它允许开发者在浏览器环境中解析XML文档或者XML字符串,从而在Web应用中有效地使用这些数据。XML(eXtensible Markup Language)是一种结构化数据语言,常用于...
利用jdom解析复杂xml到bean中: 1.依赖的jar:jdom-1.1.jar,commons-beanutils.1.8.3.jar,commons-logging-1.1.1.jar 2.用模板将xml解析 具体可以打断点运行主类:/xml_parse/src/com/vhl/main/StartMain.java,...
在Windows环境下,XML解析器是处理和解析XML文档所必需的组件。本文将详细讲解如何安装“XML解析器安装包”,以及在MFC(Microsoft Foundation Classes)中如何利用它来调用IXMLDOMDocumentPtr类的函数。 首先,...
【基于XML的简易联系人备忘录】 XML(Extensible Markup Language)是一种可扩展标记语言,常用于数据交换、配置文件存储以及结构化数据的表示。在这个基于XML的简易联系人备忘录中,XML被用来作为数据存储的格式,...
在本例中,作者选择使用DOM4j库来进行XML的解析与校验,并且结合了javax.xml.parsers包中的SAXParser来实现XML与XSD之间的校验。这种方法相对直观且易于理解。 #### 示例代码详解 首先,我们来看一下示例中给出的...
2. **XML解析**:XML文档由元素、属性、文本等构成,解析XML时,我们需要读取这些元素并将其转换为内存中的数据结构。Python中可以使用`xml.etree.ElementTree`库进行解析,Java中可使用DOM或SAX解析器。 3. **XML...
在Microsoft Foundation Classes (MFC)库中,XML处理主要依赖于两个关键类:`CXMLDOMDocument` 和 `CXMLEventSink`。这两个类提供了解析XML文档和处理XML事件的能力,使得开发者能够在Visual C++环境中方便地操作XML...
C语言解析XML文件 本文主要讲解了使用C语言解析XML文件的方法,通过分析给定的源码,总结出了一些重要的知识点。 1. XML解析器的实现 XML解析器是将XML文件转换成可以被程序所读取的格式的工具。在给定的源码中...
- XML解析时需考虑编码问题,确保输入的XML文档和程序的处理方式一致。 - 错误处理至关重要,应捕获并记录解析过程中的错误。 - 对于大型XML文档,使用SAX或Pull解析器可以避免一次性加载整个文档,减少内存占用。 ...
本文将深入探讨使用C语言编写的XML文件解析源码,并讲解如何实现XML文件的基本操作,如查找、增加和删除节点。 在C语言中处理XML文件通常涉及到以下几个关键步骤: 1. **内存管理**:由于C语言没有内置的高级数据...
接下来,我们来看看如何使用DOM4J来解析和校验XML文档。DOM4J提供了一种简单的方法来加载XML和XSD文件,然后使用Schema类进行校验。以下是一个基本的步骤概述: 1. 加载XSD文件:使用DOM4J的DocumentHelper类的...
SOAP解析,与一般的xml解析不一样,他中间存在报文,解析到就出错了,也就解析不下去,这里举了一个列子,(网络上找了好久都没找到我想要的列子,最后我自己根据例子做了整理做出来的),把数据组合成集合。...
java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
该解析器最大的特点就是小型、无须依赖其他类库,只需要 GCC 编译器 和 make 程序即可编译,支持 UTF-8/UTF-16 编码。Mini-XML支持读取UTF-8和UTF-16和UTF-8编码的XML文件和字符串写。数据存储在链表树结构,保留XML...
这种解析器可能不依赖于外部库,而是直接处理XML文档的字节流,以减少内存占用和提高解析速度。 源代码是学习任何软件技术的基础,尤其是对于嵌入式XML解析器。通过阅读和分析源代码,开发者可以了解解析过程中的...