атрибут xmlns:soap элемента SOAP

Определение operator<< может быть следующим:

std::ostream& operator<<(std::ostream& out, const LLSortedPosInt& l) {
    out << "<";
    NodePtr current = l.head;
    // check that it actually points to a Node before accessing any fields
    if(current) {
        out << current->key;
        // loop through the links and stream the keys
        while((current = current->next) != nullptr)
            out << "," << current->key;
    }
    out << ">";
    return out;
}

Конструктор LLSortedPosInt(int key) не должен создавать узел HEAD_OF_LIST, поскольку он ни для чего не используется. Таким образом, вы можете изменить этот конструктор, чтобы использовать тот, который у вас уже есть, для списка ключей через делегирование. Делегирование также облегчает добавление конструктора, используя initializer_list:

LLSortedPosInt(const int *keys=nullptr, size_t n=0) :
    head(nullptr)
{
    if(keys && n) {
        while(n--) {
            createNode(*keys);
            ++keys;
        }
    }
}

// single key construction
LLSortedPosInt(int key) :
    LLSortedPosInt(&key, 1) // delegate
{}

// construction using an initializer list
LLSortedPosInt(std::initializer_list<int> il) :
    LLSortedPosInt(il.begin(), il.size()) // delegate
{}

Интерфейс static createNode немного странный. Пользователям функции не нужно указывать указатель на следующий узел. Вот для чего предназначен контейнерный класс. Его можно превратить в обычную функцию-член и напрямую создать узел в правильном месте:

NodePtr createNode(int key) {
    NodePtr current = head;
    NodePtr previous = nullptr;

    while(current && (current->key < key)) {
        previous = current;
        current = current->next;
    }

    if(previous) {
        // insert the node between previous and previous->next
        NodePtr rv = new Node(key, previous->next);
        return previous->next = rv;
    } else {
        // insert the node first in the list
        NodePtr rv = new Node(key, head);
        return head = rv;
    }
}

Учитывая, что фактический Node выглядит примерно так:

struct Node {
    Node* next;
    int key;
    Node(int k, Node* n) : next(n), key(k) {}
    Node(const Node&) = delete;
    Node(Node&&) = delete;
    Node& operator=(const Node&) = delete;
    Node& operator=(Node&&) = delete;
    ~Node() = default;
};

using NodePtr = Node*;
5
задан Warrior 16 May 2009 в 16:20
поделиться

3 ответа

Те "xmlns:" атрибуты не относятся к SOAP. Они определяют префиксы, которые позже будут использоваться для обозначения пространств имен XML. Пример:

<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" 
    DTS:ExecutableType="SSIS.Package.2">

Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.

Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.

<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" 
    DTS:ExecutableType="SSIS.Package.2">

Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.

Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.

<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" 
    DTS:ExecutableType="SSIS.Package.2">

Это определяет DTS как префикс, который означает пространство имен «www.microsoft.com/SqlServer/Dts». Затем он обращается к атрибуту ExecutableType из этого пространства имен.

Пространства имен XML выполняют ту же работу, что и пространство имен в C # или C ++. Они предоставляют пространство для определения имен, чтобы имена из одного пространства имен не конфликтовали с именами в другом. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.

чтобы имена из одного пространства имен не конфликтовали с именами из другого. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.

чтобы имена из одного пространства имен не конфликтовали с именами из другого. Вы можете определить свой собственный атрибут ExecutableType, и он может означать нечто совершенно отличное от того, что определено Microsoft. Оба могут использоваться в одном документе, без какой-либо двусмысленности в том, что есть что.

11
ответ дан 18 December 2019 в 12:01
поделиться

Судя по уровню вашего вопроса (пожалуйста, не обижайтесь), похоже, что вы новичок в XML, а также в веб-сервисах на основе XML. Джон Сондерс правильно описывает пространства имен XML и их использование. Если вы хотите лучше понять веб-службы, основанные на XML и XML, я рекомендую вам начать с руководства по XML в W3 Schools (в частности, с раздела о пространствах имен XML).

Учебное пособие находится по адресу: http://www.w3schools.com/xml/default.asp

Раздел, посвященный пространствам имен XML, находится по адресу: http://www.w3schools.com/xml/xml_namespaces.asp

3
ответ дан 18 December 2019 в 12:01
поделиться

Эта цитата из спецификаций W3C SOAP также должна помочь здесь:

Приложение SOAP ДОЛЖНО включать правильное пространство имен SOAP для всех элементов и атрибуты, определенные SOAP в сообщения, которые он генерирует. Мыло приложение ДОЛЖНО обрабатывать Пространства имен SOAP в сообщениях, которые он получает. Он ДОЛЖЕН отбрасывать сообщения которые имеют неправильные пространства имен (см. раздел 4.4) и МОЖЕТ обрабатывать SOAP сообщения без пространств имен SOAP как хотя у них был правильный SOAP пространства имен.

SOAP определяет два пространства имен (см. [8] для получения дополнительной информации о XML пространства имен):

• Конверт SOAP имеет пространство имен идентификатор " http://schemas.xmlsoap.org/soap/envelope/ "

• Сериализация SOAP имеет идентификатор пространства имен " http://schemas.xmlsoap.org/soap/encoding/ "

Сообщение SOAP НЕ ДОЛЖНО содержать Объявление типа документа. Мыло сообщение НЕ ДОЛЖНО содержать Обработку Инструкции. [7]

1
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: