Ссылки на XSD с гарантированной уверенностью Другие XSD

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

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


person bnunamak    schedule 01.12.2013    source источник
comment
Используйте настраиваемый ResourceResolver: см. Здесь stackoverflow.com/questions/1094893/   -  person Michael Kay    schedule 01.12.2013


Ответы (1)


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

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

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

person Johan    schedule 22.01.2014