Сериализация графа зависимостей в XML - PullRequest
0 голосов
/ 26 августа 2011

Что бы вы выбрали для xml-файла, который содержит определенные элементы, которые ссылаются на n других элементов.Фон для этих вопросов - это технологическое дерево (график), сериализованное в виде XML-документа.Например, техническая «Пушка» обязательна для двух других узлов (элементов) «Железо» и «Порох».

enter image description here Источник: http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

Это ориентированный граф.Я уверен, что для этого есть много основанных на xml представлений, но на ум приходит graphml:

<graphml>
<graph id="techtree" edgedefault="directed">
    <node id="gunpowder" />
    <node id="iron" />
    <node id="cannons" />
    <edge source="gunpowder" target="cannons" />
    <edge source="gunpowder" target="cannons" />
</graph>
</graphml>

Обратите внимание, что это только из памяти, вероятно, есть множество пространств имен и других необходимых вещей.

1 голос
/ 26 августа 2011

По своей природе XML вводит древовидную структуру в документ.Если отношение между элементом и его дочерними узлами считается определением «позволяет вам создавать», то у вас возникнет проблема, когда вы столкнетесь с ситуацией, когда на определенные объекты ссылаются более одного раза.В конечном итоге вам придётся указывать их дважды, без очевидного способа сказать, что они представляют одну и ту же вещь.

Давайте посмотрим на Iron из вашего примера:

<iron>
    <cannons/>
    <guns/>
</iron>

Нет проблемтам, однако, у Вуда будет ...

<wood>
    <forge/>
    <arrows/>
    <guns/>
</wood>

Здесь также появляется элемент guns.Представленное выше представление очень простое, но, возможно, с каждым элементом будет связано гораздо больше данных, и вы захотите избежать повторения.Вы также столкнетесь с проблемами, когда ваш граф будет содержать циклы, хотя я полагаю, что он не будет действительным в любом случае, учитывая семантику.Также обратите внимание, что древесина является прямым требованием к оружию, но оружие также косвенно зависит от дерева через железо.Это усложнит представление.

Можно сделать несколько вещей.Прежде всего, каждый элемент и содержащаяся в нем структура могут быть размещены отдельно в XML-документе, а затем каким-то образом ссылаться на них ...

<guns itemId="1">
    <!-- embedded structure -->
</guns>
...
<iron>
    <item>1</item>
</iron>
<wood>
    <item>1</item>
</wood>

Однако вам остается только программно разрешить такие ссылки.Преимущества XML, будучи такими инструментами, как парсеры, XSLT и привязка объектов, частично утрачены.

Другими вариантами может быть ссылка на элементы через XLink , что кажется естественным совпадением.Или используйте XInclude , чтобы определить вещи только один раз, а затем включить их в различные места.Ваш «встроенный» XML с разрешенными включениями все равно будет содержать все дубликаты данных.Но, по крайней мере, теперь это уже не может стать противоречивым.

Но это только один из способов взглянуть на это.Вместо того, чтобы пытаться получить ту же направленность в дереве XML, что и в вашем графике, как насчет изменения направления?Вместо отношения «позволяет создавать» вы можете создать отношение «требуется».

Возвращаясь к Железу:

<iron>
    <forge/>
</iron>

Теперь вы знаете, что Железу требуется Кузница.,Оружие:

<guns>
    <gunpowder/>
    <iron/>
    <wood/>
</guns>

Но проблема остается той же: вы не можете просто встраивать одну структуру в другую, потому что в какой-то момент одна и та же вещь понадобится в нескольких местах.Forge требует Wood, но также и Guns.

XML работает для древовидных структур, но в тот момент, когда ваш график не строго придерживается такой структуры, становится трудно представить его с помощью XML.По крайней мере, трудно в том смысле, что вы не получите от этого больших преимуществ и вам все равно придется много программировать самостоятельно.

Я не знаю ни одного (де) сериализуемого представления данных, которое быидеально подходит для графиков любого вида.Есть программный пакет под названием Graphviz, который предназначен специально для рендеринга графиков;это с открытым исходным кодом, поэтому, возможно, документация и / или код может дать некоторые хорошие идеи.

...