public void Parse() { _rootNode = TryParseNode(); if (_rootNode == null) { throw new XMLFragmentException("Unable to load root node"); } }
public XMLFragmentElement TryParseNode() { if (_buffer.EndOfBuffer) return null; int startOuterXml = _buffer.Position; var 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) { var 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; }
public void Parse() { _rootNode = TryParseNode(); if (_rootNode == null) throw new XMLFragmentException("Unable to load root node"); }
Vec2 ReadVector(XMLFragmentElement node) { return Vec2.Parse(node.Value); }
object ReadSimpleType(XMLFragmentElement node, Type type, bool outer) { if (type == null) return ReadSimpleType(node.Elements[1], Type.GetType(node.Elements[0].Value), outer); var 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 XMLFragmentElement TryParseNode() { if (_buffer.EndOfBuffer) { return(null); } int startOuterXml = _buffer.Position; var 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) { var 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); }