关于项目自动化测试架构的改良计划 - 解析XInclude标记

因为在test_suite.xml中,我们多处使用了XInclude标记,他们会被申明在一个叫"http://www.w3.org/2001/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的情况,它没办法定位,但是未来可能会支持这个功能。

http://xerces.apache.org/xerces2-j/faq-xinclude.html#faq-8

113429863.png


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



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





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221731,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值