博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于项目自动化测试架构的改良计划 - 解析XInclude标记
阅读量:6824 次
发布时间:2019-06-26

本文共 2385 字,大约阅读时间需要 7 分钟。

因为在test_suite.xml中,我们多处使用了XInclude标记,他们会被申明在一个叫" 的名字空间中,并且引入部分用xi:include来声明,我们这个类的作用就是把这些所有的<xi:include>的部分,都用被引入的文件插入和替换掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 
* This class will handle converting a xinclude+xpointer marked xml file to a normal xml file
 
* Because of the shortage of the current jdk ,it only support the xPointer with element instead of NCName
 
*@author cwang58
 
*@created date: Jun 10, 2013
 
*/
public 
class 
XIncludeConverter {
                                                                                                                                                   
    
/**
     
* this method will handle change the XInclude+XPointer marked xml as normal xml
     
* @param origialXML the original xml which has the xInclude feature
     
* @return the parsedXML without the xInclude feature
     
*/
    
public 
static 
String convertXInclude2NormalXML(String originalXML)
            
throws 
SAXException,ParserConfigurationException,TransformerConfigurationException,IOException,TransformerException{
          
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          
//open up the namespace aware so that it can recognize the "xi" namespace
          
factory.setNamespaceAware(
true
);
          
//let this SAXParser support XInclude
          
factory.setXIncludeAware(
true
);
          
//factory.setValidating(true);
          
//ignore all the comments added in the source document
          
factory.setIgnoringComments(
true
);
          
DocumentBuilder docBuilder = factory.newDocumentBuilder();
          
Document doc = docBuilder.parse(
new 
InputSource(
new 
ByteArrayInputStream(originalXML.getBytes(
"utf-8"
))));
          
Transformer transformer = TransformerFactory.newInstance().newTransformer();
          
//format the output xml string so it support indent and more readable
          
transformer.setOutputProperty(OutputKeys.INDENT, 
"yes"
);
          
//initialize StreamResult with File object to save to file
          
StreamResult result = 
new 
StreamResult(
new 
StringWriter());
          
DOMSource source = 
new 
DOMSource(doc);
          
transformer.transform(source, result);
          
return 
result.getWriter().toString();
        
}

这里讲一个小插曲,其实,W3C中,XInclude经常和Xpointer联合起来应用的,xpointer可以帮助来定位目标文件的某个小片段而不是整个目标文件,定位方法可以用element(),或者xpointer(),如果element的话,可以用(/1/2/3)这种方式来定位DOM,或者基于 id,对应java的解析框架是xerce,但是非常不幸运的是,最新版本的xerce框架只支持element(/1/3/4/5)这种定位,而对于基于schema-id的方式,也就是某个element声明了id的情况,它没办法定位,但是未来可能会支持这个功能。

基于上述的局限性,我决定只采用xi:include来包含全部文件,然后局部调整的做法,并且绕过xpointer。

所以实现代码如上所示,事实上从JDK 1.6开始,他已经提供了对XInclude的支持,内部是委托给xerce来实现的,这是对应架构图的第3-4步骤。

本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221731,如需转载请自行联系原作者
你可能感兴趣的文章
VS 2013的初配置
查看>>
变量提升和函数提升
查看>>
Javascript基础复习 - jQuery Proxy函数
查看>>
【BZOJ5306】 [Haoi2018]染色
查看>>
dotnet webservice处理数据量过大,ajax请求返回500错误解决方案
查看>>
实验六 在应用程序中播放音频和视频
查看>>
NYOJ242计算球体积
查看>>
[20180901]四校联考
查看>>
小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发...
查看>>
《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,笔记(下)...
查看>>
从零开始搭建创业公司后台技术栈
查看>>
作业八
查看>>
thinkphp总体设计
查看>>
使用 Button 类在 XNA 中创建图形按钮(九)
查看>>
Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树...
查看>>
10.3 定位连续值范围的开始点和结束点
查看>>
js 正则验证数字和小数
查看>>
排列组合的代码总结篇
查看>>
k8s基础
查看>>
[转载] 软件测试相关的63个国外站点
查看>>