Еще одно приложение - это интрузивные списки. Тип элемента может рассказать о том, каковы его следующие / предыдущие указатели. Таким образом, список не использует жестко заданные имена, но все равно может использовать существующие указатели:
// say this is some existing structure. And we want to use
// a list. We can tell it that the next pointer
// is apple::next.
struct apple {
int data;
apple * next;
};
// simple example of a minimal intrusive list. Could specify the
// member pointer as template argument too, if we wanted:
// template<typename E, E *E::*next_ptr>
template<typename E>
struct List {
List(E *E::*next_ptr):head(0), next_ptr(next_ptr) { }
void add(E &e) {
// access its next pointer by the member pointer
e.*next_ptr = head;
head = &e;
}
E * head;
E *E::*next_ptr;
};
int main() {
List<apple> lst(&apple::next);
apple a;
lst.add(a);
}
Ни один из них не является более «правильным», чем другой, оба будут работать для вашего примера. Ничто не нарушает никаких правил.
Я сказал, что согласен с W3Schools на этом, поскольку эти данные должны проходить внутри дочерних элементов, а не из атрибутов. Особенно такие вещи, как IP-адреса, просто FEEL, как данные, которые должны быть дочерним элементом, а не атрибутом. Атрибуты, которые я обычно использую для метаданных, таких как автоматически сгенерированные идентификаторы.
Это особенно верно, если позже вы хотите учитывать расширение - например, что, если вы хотите связать несколько IP-адресов? С дочерними элементами вы можете просто добавить еще один элемент, но с атрибутами вы должны придумать новое имя атрибута для каждого добавления (ip1, ip2, ip3 ...).
Отсутствует «правильный» способ представления данных в XML при выборе между использованием элементов или атрибутов свойств объекта. Выберите все, что работает для вас.
Как правило, элементы дают больше свободы, поскольку в конечном итоге вы можете получить субэлементы. То есть Если свойство является списком какого-либо вида, представляющим его как значение, разделенное запятыми, в атрибуте выглядит очень не-XML.
Сторона примечания: «XML-схема» обычно означает другую вещь - структурированная схема для XML ... что у вас есть, я бы назвал «представление данных в XML».
Классическая статья о том, как выбирать между элементами и атрибутами, приведена здесь:
http://xml.coverpages.org/elementsAndAttrs.html
Я отмечаю, что в конце страницы он цитирует Джона Коуэна, цитируя меня: «Бегунники всегда задают этот вопрос. Те, у кого небольшой опыт, выражают свое мнение страстно. Эксперты говорят вам, что нет правильного ответа».