public JsonSchemaNode AddSchema(JsonSchemaNode existingNode, JsonSchema schema)
        {
            string newId;
              if (existingNode != null)
              {
            if (existingNode.Schemas.Contains(schema))
              return existingNode;

            newId = JsonSchemaNode.GetId(existingNode.Schemas.Union(new[] { schema }));
              }
              else
              {
            newId = JsonSchemaNode.GetId(new[] { schema });
              }

              if (_nodes.Contains(newId))
            return _nodes[newId];

              JsonSchemaNode currentNode = (existingNode != null)
            ? existingNode.Combine(schema)
            : new JsonSchemaNode(schema);

              _nodes.Add(currentNode);

              if (schema.Properties != null)
              {
            foreach (KeyValuePair<string, JsonSchema> property in schema.Properties)
            {
              AddProperty(currentNode, property.Key, property.Value);
            }
              }

              if (schema.Items != null)
              {
            for (int i = 0; i < schema.Items.Count; i++)
            {
              AddItem(currentNode, i, schema.Items[i]);
            }
              }

              if (schema.AdditionalProperties != null)
            AddAdditionalProperties(currentNode, schema.AdditionalProperties);

              if (schema.Extends != null)
            currentNode = AddSchema(currentNode, schema.Extends);

              return currentNode;
        }