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); }
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); }