コード例 #1
0
        public ManifestTreeNode GetTree(string xml)
        {
            var rootNode = new ManifestTreeNode();
            var document = new XmlDocument();

            document.Load(new StringReader(xml));
            RecurseXmlDocument(document.DocumentElement, ref rootNode, null);
            return(rootNode);
        }
コード例 #2
0
        internal ManifestTreeNode GetTree(XmlSchemaSet set)
        {
            XmlSchema customerSchema = null;

            foreach (XmlSchema schema in set.Schemas())
            {
                customerSchema = schema;
            }
            var rootNode = new ManifestTreeNode();

            foreach (XmlSchemaElement element in customerSchema.Elements.Values)
            {
                rootNode.NodePath = "/";
                if (customerSchema.Namespaces.Count > 0)
                {
                    rootNode.Namespace = GetXsdNamespace(customerSchema.TargetNamespace, customerSchema.Namespaces.ToArray());
                }
                RecursiveElementAnalyser(element, ref rootNode, rootNode.Namespace);
            }

            return(rootNode);
        }
コード例 #3
0
        private void RecursiveElementAnalyser(XmlSchemaElement element, ref ManifestTreeNode node, ManifestXmlNamespace xmlNamespace)
        {
            string elementName     = element.Name ?? element.RefName.ToString();
            var    children        = new List <ManifestTreeNode>();
            string nameSpacePrefix = xmlNamespace != null ? xmlNamespace.Prefix : string.Empty;

            //string dataType = element.ElementSchemaType.TypeCode.ToString(); // we are not using this anymore.

            node.Name        = element.Name ?? element.RefName.ToString();
            node.DisplayName = elementName;
            //node.NodeDataType = dataType;
            node.NodeType = XmlNodeTypeEnum.Element;
            var nameSpaceXPath = !string.IsNullOrEmpty(element.Name) ? !string.IsNullOrEmpty(nameSpacePrefix) ? $"{nameSpacePrefix}:" : "" : "";

            node.NodePath = node.NodePath + nameSpaceXPath + element.Name;

            var complexType = element.ElementSchemaType as XmlSchemaComplexType;

            if (complexType != null)
            {
                if (complexType.AttributeUses.Count > 0)
                {
                    var enumerator = complexType.AttributeUses.GetEnumerator();
                    while (enumerator.MoveNext())
                    {
                        var attribute = (XmlSchemaAttribute)enumerator.Value;

                        string attrDataType = attribute.AttributeSchemaType.TypeCode.ToString();
                        var    childNode    = new ManifestTreeNode
                        {
                            Name        = attribute.QualifiedName.Name,
                            DisplayName = attribute.QualifiedName.Name,
                            //NodeDataType = attrDataType,
                            NodeType = XmlNodeTypeEnum.Attribute,
                            NodePath = node.NodePath + "/@" + attribute.QualifiedName.Name
                        };
                        children.Add(childNode);
                    }
                }

                var sequence = complexType.ContentTypeParticle as XmlSchemaSequence;
                if (sequence != null)
                {
                    foreach (var childElement in sequence.Items)
                    {
                        var xmlSchemaElement = childElement as XmlSchemaElement;
                        if (xmlSchemaElement != null)
                        {
                            if (xmlSchemaElement.RefName == null)
                            {
                                RecursiveElementAnalyser(xmlSchemaElement, ref node, xmlNamespace);
                            }
                            else if (xmlSchemaElement.RefName != null)
                            {
                                string seqDataType = sequence.GetType().ToString();
                                nameSpaceXPath = !string.IsNullOrEmpty(nameSpacePrefix) ? $"{nameSpacePrefix}:" : "";
                                var childNode = new ManifestTreeNode
                                {
                                    Name        = xmlSchemaElement.RefName.Name,
                                    DisplayName = xmlSchemaElement.RefName.Name,
                                    //NodeDataType = seqDataType,
                                    NodeType = XmlNodeTypeEnum.Element,
                                    NodePath = !string.IsNullOrEmpty(xmlSchemaElement.RefName.Name) ? $"{node.NodePath}/{nameSpaceXPath}{xmlSchemaElement.RefName}" : $"{node.NodePath}/{xmlSchemaElement.RefName}"
                                };

                                RecursiveElementAnalyser(xmlSchemaElement, ref childNode, xmlNamespace);
                                children.Add(childNode);
                            }
                            else
                            {
                                var choice = childElement as XmlSchemaChoice;
                                if (choice != null)
                                {
                                    foreach (var choiceElement in choice.Items)
                                    {
                                        var xmlChoiceSchemaElement = choiceElement as XmlSchemaElement;
                                        if (xmlChoiceSchemaElement != null)
                                        {
                                            RecursiveElementAnalyser(xmlChoiceSchemaElement, ref node, xmlNamespace);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            node.Children = children;
        }
コード例 #4
0
        private static XmlNode RecurseXmlDocument(XmlNode nodeofxml, ref ManifestTreeNode node, XmlNode previousnode)
        {
            node.Name        = nodeofxml.LocalName;
            node.DisplayName = nodeofxml.LocalName;
            node.NodeType    = XmlNodeTypeEnum.Element;

            if (nodeofxml.ParentNode.ParentNode == null)  // I ensure that we take the rootNode of xml
            {
                if (!string.IsNullOrEmpty(nodeofxml.NamespaceURI))
                {
                    node.Namespace = GetXmlNamespace(nodeofxml);
                }
            }

            var children = new List <ManifestTreeNode>();
            int countSimilarChildren = 0, countskip = 0;

            foreach (XmlNode similarchildren in nodeofxml.ParentNode.ChildNodes)
            {
                if (similarchildren.Name == nodeofxml.Name)
                {
                    countSimilarChildren++;
                }
            }

            var arrayXPath     = countSimilarChildren > 1 ? "[*]" : string.Empty;
            var nameSpaceXPath = String.IsNullOrEmpty(nodeofxml.GetPrefixOfNamespace(nodeofxml.NamespaceURI)) && !String.IsNullOrEmpty(nodeofxml.NamespaceURI) ? "ns:" : "";

            node.NodePath = $"{node.NodePath}/{nameSpaceXPath}{nodeofxml.Name}{arrayXPath}";

            for (int index = 0; index < nodeofxml.Attributes.Count; index++)
            {
                if (countskip == 0)
                {
                    if (!nodeofxml.Attributes[index].Name.Contains("xmlns"))
                    {
                        var childNode = new ManifestTreeNode
                        {
                            Name        = nodeofxml.Attributes[index].LocalName,
                            DisplayName = nodeofxml.Attributes[index].LocalName,
                            //NodeDataType = root.GetType().Name.ToString(),
                            NodeType = XmlNodeTypeEnum.Attribute,
                            NodePath = node.NodePath + "/@" + nodeofxml.Attributes[index].Name
                        };
                        children.Add(childNode);
                    }
                }
            }

            if (nodeofxml is XmlElement)
            {
                XmlNodeList listofchildren = nodeofxml.ChildNodes;
                foreach (XmlNode child in listofchildren)
                {
                    if (child.Name != "#text")
                    {
                        countskip = previousnode != null && previousnode.Name == child.Name ? 1 : 0;
                        if (countskip == 0)
                        {
                            var childNode = new ManifestTreeNode
                            {
                                Name        = child.LocalName,
                                DisplayName = child.LocalName,
                                //NodeDataType = child.GetType().Name.ToString(),
                                NodeType = XmlNodeTypeEnum.Element,
                                NodePath = node.NodePath
                            };

                            previousnode = RecurseXmlDocument(child, ref childNode, previousnode);
                            children.Add(childNode);
                        }
                    }
                }
            }

            node.Children = children;
            return(nodeofxml);
        }