java - 放心的 XSD 引用其他 XSD

标签 java xml rest xsd rest-assured

我正在使用 Rest-Assured 根据架构编写 XML validator 。但是,我在处理引用其他 XSD 的 XSD 时遇到问题,因为我使用 GET 从 URL 检索原始 XSD。

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

我有两个问题: 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;
}

提前非常感谢您!

最佳答案

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

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

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

关于java - 放心的 XSD 引用其他 XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312613/

相关文章:

Java 8如何使用Stream检查一个数字是否除以多个数字

c# - 从 XML 节点读取值?

android - 如何创建一个按钮来显示直方图? (提供直方图示例代码)

java - Rest API 如何根据输入 header 返回 Json 和 XML 响应?

java - 英特尔lij : How do I display Java signature on one line?

java - 将表单响应存储在 session 数据中

java - 矩形在多边形内?

xml - pretty-print - Spark/Scala 中的 XML 单记录

java - 为什么当我在存储库中保存对象时相同的 id 会递增?

java - 如何映射可以具有不同类型并从另一个类扩展的请求对象数据?