Я программирую XML-валидатор в соответствии с схемами с использованием Rest-Assured. Однако у меня возникают проблемы с обработкой XSD, которые ссылаются на другие XSD, потому что я извлекаю исходный XSD из URL с помощью GET.Rest-Assured XSD Ссылки Другие XSD
Я пытался реализовать свой собственный синтаксический анализ, чтобы объединить 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;
}
Большое спасибо заранее!
Использование пользовательских ResourceResolver: смотрите здесь http://stackoverflow.com/questions/1094893/validate-an-xml-file-against-multiple-schema-definitions –