2013-12-01 5 views
1

Я программирую 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; 
} 

Большое спасибо заранее!

+0

Использование пользовательских ResourceResolver: смотрите здесь http://stackoverflow.com/questions/1094893/validate-an-xml-file-against-multiple-schema-definitions –

ответ

0

Возможно, вы можете использовать XmlConfig в подробной конфигурации. Это дает вам доступ к настройке функций и пространств имен и т.д. Например, если вы хотите, чтобы отключить загрузку внешнего DTD-х вы могли бы сделать:

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

Так может быть, вы могли бы посмотреть в методе «disableLoadingOfExternalDtd», чтобы увидеть, как это реализовано чтобы получить некоторые подсказки.

Смежные вопросы