예제 #1
0
        public static VersionDetails WriteDependency(this XmlWriter writer, XmlReader reader, VersionDetails details)
        {
            var oldDetails = new VersionDetails();

            writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
            writer.WriteAttributeString("Name", reader.NamespaceURI, details.Name);
            writer.WriteAttributeString("Version", reader.NamespaceURI, details.Version);

            oldDetails.Name    = reader.GetAttribute("Name");
            oldDetails.Version = reader.GetAttribute("Version");
            if (details.CoherentParentDependency != null)
            {
                writer.WriteAttributeString("CoherentParentDependency", reader.NamespaceURI, details.CoherentParentDependency);
            }

            bool wroteUri = false, wroteSha = false;

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    if (reader.Name == "Uri")
                    {
                        oldDetails.Uri = writer.WriteUpdatedElementString(reader, details.Uri);
                        wroteUri       = true;
                    }
                    else if (reader.Name == "Sha")
                    {
                        oldDetails.Sha = writer.WriteUpdatedElementString(reader, details.Sha);
                        wroteSha       = true;
                    }
                    else
                    {
                        writer.WriteNode(reader);
                    }
                    break;

                case XmlNodeType.EndElement:
                    writer.WriteNode(reader);
                    if (reader.Name == "Dependency")
                    {
                        if (!(wroteSha && wroteUri))
                        {
                            throw new Exception("Something was missed");
                        }

                        return(oldDetails);
                    }
                    break;

                default:
                    writer.WriteNode(reader);
                    break;
                }
            }
            return(oldDetails);
        }
예제 #2
0
        public static VersionDetails ReadDependency(this XmlReader reader)
        {
            var details = new VersionDetails();

            while (reader.MoveToNextAttribute())
            {
                ReadDetails(reader, details);
            }

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    ReadDetails(reader, details);
                    break;

                case XmlNodeType.EndElement when reader.Name == "Dependency":
                    return(details);
                }
            }

            void ReadDetails(XmlReader read, VersionDetails detail)
            {
                var name = read.Name;

                if (read.NodeType == XmlNodeType.Element)
                {
                    read.Read();
                }

                switch (name)
                {
                case "Name":
                    detail.Name = read.Value;
                    break;

                case nameof(VersionDetails.Version):
                    detail.Version = read.Value;
                    break;

                case nameof(VersionDetails.Uri):
                    detail.Uri = read.Value;
                    break;

                case nameof(VersionDetails.Sha):
                    detail.Sha = read.Value;
                    break;

                case nameof(VersionDetails.CoherentParentDependency):
                    detail.CoherentParentDependency = read.Value;
                    break;

                default:
                    read.Skip();
                    break;
                }
            }

            return(details);
        }