private Vector2 ReadVector(XMLFragmentElement node) { string[] values = node.Value.Split(' '); return new Vector2(float.Parse(values[0]), float.Parse(values[1])); }
public XMLFragmentElement TryParseNode() { if (_buffer.EndOfBuffer) return null; int startOuterXml = _buffer.Position; string token = NextToken(); if (token != "<") throw new XMLFragmentException("Expected \"<\", got " + token); XMLFragmentElement element = new XMLFragmentElement(); element.Name = NextToken(); while (true) { token = NextToken(); if (token == ">") break; else if (token == "/") // quick-exit case { NextToken(); element.OuterXml = TrimControl(_buffer.Buffer.Substring(startOuterXml, _buffer.Position - startOuterXml)).Trim(); element.InnerXml = ""; return element; } else { XMLFragmentAttribute attribute = new XMLFragmentAttribute(); attribute.Name = token; if ((token = NextToken()) != "=") throw new XMLFragmentException("Expected \"=\", got " + token); attribute.Value = NextToken(); element.Attributes.Add(attribute); } } while (true) { int oldPos = _buffer.Position; // for restoration below token = NextToken(); if (token == "<") { token = PeekToken(); if (token == "/") // finish element { NextToken(); // skip the / again token = NextToken(); NextToken(); // skip > element.OuterXml = TrimControl(_buffer.Buffer.Substring(startOuterXml, _buffer.Position - startOuterXml)).Trim(); element.InnerXml = TrimTags(element.OuterXml); if (token != element.Name) throw new XMLFragmentException("Mismatched element pairs: \"" + element.Name + "\" vs \"" + token + "\""); break; } else { _buffer.Position = oldPos; element.Elements.Add(TryParseNode()); } } else { // value, probably _buffer.Position = oldPos; element.Value = ReadUntil('<'); } } return element; }
private object ReadSimpleType(XMLFragmentElement node, Type type, bool outer) { if (type == null) return ReadSimpleType(node.Elements[1], Type.GetType(node.Elements[0].Value), outer); XmlSerializer serializer = new XmlSerializer(type); XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); xmlnsEmpty.Add("", ""); using (MemoryStream stream = new MemoryStream()) { StreamWriter writer = new StreamWriter(stream); { writer.Write((outer) ? node.OuterXml : node.InnerXml); writer.Flush(); stream.Position = 0; } XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; return serializer.Deserialize(XmlReader.Create(stream, settings)); } }
public void Parse() { _rootNode = TryParseNode(); if (_rootNode == null) throw new XMLFragmentException("Unable to load root node"); }