示例#1
0
        /// <summary>
        ///    Renders the current instance as child of the given node to the
        ///    given <see cref="XmlNode"/>
        /// </summary>
        /// <param name="parent">
        ///    A <see cref="XmlNode"/> to render the current instance as child of.
        /// </param>
        public void RenderInto(XmlNode parent)
        {
            if (IsRootNode)
            {
                AddAllChildrenTo(parent);
            }
            else if (IsReallySimpleType && parent.Attributes.GetNamedItem(XmpTag.PARSE_TYPE_URI, XmpTag.RDF_NS) == null)
            {
                // Simple values can be added as attributes of the parent node. Not allowed when the parent has an rdf:parseType.
                XmlAttribute attr = XmpTag.CreateAttribute(parent.OwnerDocument, Name, Namespace);
                attr.Value = Value;
                parent.Attributes.Append(attr);
            }
            else if (Type == XmpNodeType.Simple || Type == XmpNodeType.Struct)
            {
                var node = XmpTag.CreateNode(parent.OwnerDocument, Name, Namespace);
                node.InnerText = Value;

                if (Type == XmpNodeType.Struct)
                {
                    // Structured types are always handled as a parseType=Resource node. This way, IsReallySimpleType will
                    // not match for child nodes, which makes sure they are added as extra nodes to this node. Does the
                    // trick well, unit tests that prove this are in XmpSpecTest.
                    XmlAttribute attr = XmpTag.CreateAttribute(parent.OwnerDocument, XmpTag.PARSE_TYPE_URI, XmpTag.RDF_NS);
                    attr.Value = "Resource";
                    node.Attributes.Append(attr);
                }

                AddAllQualifiersTo(node);
                AddAllChildrenTo(node);
                parent.AppendChild(node);
            }
            else if (Type == XmpNodeType.Bag)
            {
                var node = XmpTag.CreateNode(parent.OwnerDocument, Name, Namespace);
                // TODO: Add all qualifiers.
                if (QualifierCount > 0)
                {
                    throw new NotImplementedException();
                }
                var bag = XmpTag.CreateNode(parent.OwnerDocument, XmpTag.BAG_URI, XmpTag.RDF_NS);
                foreach (var child in Children)
                {
                    child.RenderInto(bag);
                }
                node.AppendChild(bag);
                parent.AppendChild(node);
            }
            else if (Type == XmpNodeType.Alt)
            {
                var node = XmpTag.CreateNode(parent.OwnerDocument, Name, Namespace);
                // TODO: Add all qualifiers.
                if (QualifierCount > 0)
                {
                    throw new NotImplementedException();
                }
                var bag = XmpTag.CreateNode(parent.OwnerDocument, XmpTag.ALT_URI, XmpTag.RDF_NS);
                foreach (var child in Children)
                {
                    child.RenderInto(bag);
                }
                node.AppendChild(bag);
                parent.AppendChild(node);
            }
            else if (Type == XmpNodeType.Seq)
            {
                var node = XmpTag.CreateNode(parent.OwnerDocument, Name, Namespace);
                // TODO: Add all qualifiers.
                if (QualifierCount > 0)
                {
                    throw new NotImplementedException();
                }
                var bag = XmpTag.CreateNode(parent.OwnerDocument, XmpTag.SEQ_URI, XmpTag.RDF_NS);
                foreach (var child in Children)
                {
                    child.RenderInto(bag);
                }
                node.AppendChild(bag);
                parent.AppendChild(node);
            }
            else
            {
                // Probably some combination of things we don't fully cover yet.
                Dump();
                throw new NotImplementedException();
            }
        }