温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-17 18:31:41 来源:网络 阅读:594 作者:charles_wang888 栏目:软件技术


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


/**
 * 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

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


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



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



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI