1

我正在使用 Rest-Assured 根据模式对 XML 验证器进行编程。但是,我在处理引用其他 XSD 的 XSD 时遇到了问题,因为我使用 GET 从 URL 检索原始 XSD。

我一直在尝试实现自己的解析以将 XSD(Strings) 合并为一个 XSD(String),但它正在成为一个递归怪物,而且效率极低/困难。要查看算法,请查看帖子末尾。

我有两个问题:1)我的问题是我使用 GET 来检索 XSD,所以它不在命名空间内。有没有办法获取所有引用的 XSD 并使用 Rest-Assured 合并它们?我不知道该怎么做。

2) 一般有没有更好的方法来处理包含?如您所见,我的算法非常昂贵且过于复杂(尤其是 ref 属性),而且我敢肯定,如果我更改测试用例,某些东西会很容易崩溃。

到目前为止,我的算法(避免复杂性的伪代码)如下所示:

boolean xmlValid(String xmlAddress, String xsdAddress){

    LinkedList XSDList = new LinkedList;
    XSDList.add(xsdAddress);
    xsdString = getExternalXSDStrings(XSDList);

    try{ //No PseudoCode here
       RestAssured.expect().
            statusCode(200).
            body(
                    RestAssuredMatchers.matchesXsd(xsdString)).
            when().
            get(xmlAddress);
    }catch Exceptions{...}
}

String getExternalXSDStrings(LinkedList xsdReferences, String prevString){
    LinkedList recursiveXSDReferences = new LinkedList();

    for(xsdRef:xsdReferences){
         xsdAddress = "http://..." + xsdRef;
         Open InputStream From URL;
         while(inputLine != null){

             if(prologFlag) //Do Nothing, this is to avoid multiple prologs ;

             else if(includeFlag){

                 if(refFlag) Note Reference;
                 else recursiveXSDReferences.add(includeReference);

             }else if(refFlag){

                 referenceDefinition = Extract Reference Element Definition;
                 xsdString = xsdString + referenceDefinition;

             }else{
                 xsdString = xsdString + inputLine;
             }
         }
         Close input stream;
    }
    xsdString = prevString + xsdString;
    if(xsdReferences.length > 0) return getExternalXSDStrings(recursiveXSDReferences , xsdString);
    else return xsdString;
}

非常感谢您!

4

1 回答 1

0

或许可以在详细配置中使用XmlConfig。这使您可以访问配置功能和名称空间等。例如,如果您想禁用外部 DTD 的加载,您可以这样做:

given().config(RestAssured.config().xmlConfig(xmlConfig().disableLoadingOfExternalDtd())). .. 

因此,也许您可​​以查看“disableLoadingOfExternalDtd”方法以了解它是如何实现的以获得一些提示。

于 2014-01-22T10:20:35.747 回答