我正在使用 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/