Я программирую валидатор XML по схемам с помощью Rest-Assured. Однако у меня возникают проблемы с обработкой XSD, которые ссылаются на другие XSD, потому что я получаю исходный XSD из URL-адреса с помощью GET.
Я пытался реализовать свой собственный синтаксический анализ, чтобы объединить XSD (строки) в один 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;
}
Заранее большое спасибо!