我根据使用REST的架构放心的编程XML验证。 但是,我有麻烦处理引用了其他的XSD的XSD,因为我检索使用GET的URL原来的XSD。
我一直在努力实现自己的解析巩固的XSD(字符串)到一个XSD(字符串),但它正在成为一个递归怪物,效率极其低下/困难。 看算法,看帖子的末尾。
我有两个问题:1)我的问题是,我使用GET来检索XSD,所以它不是在命名空间内。 有没有办法让所有被引用的XSD和使用REST保证的整合呢? 我不会有一个关于如何去这条线索。
2)有没有更好的方式来处理包括一般? 正如你所看到的,我的算法是非常昂贵的,过于复杂的(尤其是裁判属性),我敢肯定,事情会容易折断,如果我改变我的测试用例。
我的算法(伪代码,以避免复杂性)至今如下所示:
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;
}
非常感谢你提前!