private object FetchValue(Element item, string attributeName, string elementName, string query, bool arePersistentObjects, bool attach, TypeCache typeCache, TypeConverter typeConverter, Cache cache) { object value = null; if (!String.IsNullOrEmpty(attributeName)) { Node.Attribute attribute = item.Attribute(attributeName); value = attribute == null ? null : GetObjectFromString(attribute.Value, null, null, typeCache.Type, typeConverter); } else { object result = !String.IsNullOrEmpty(query) ? item.EvalSingle(query) : item.Children.OfType <Element>().FirstOrDefault(e => e.Name.Equals(elementName)); if (arePersistentObjects) { // Get, attach, and fetch the persistent object instance Element element = result as Element; if (element == null) { throw new Exception("Persistent value node must be an element."); } value = cache.GetObject(typeCache, element, attach); } else { Node.Node itemNode = result as Node.Node; value = GetObjectFromString(itemNode != null ? itemNode.Value : result == null ? null : result.ToString(), null, null, typeCache.Type, typeConverter); } } return(value); }
internal DomAttribute(Node.Attribute node) : base(node.Prefix, node.LocalName, node.NamespaceUri, (XmlDocument)node.Document.XmlNode) { _node = node; }
public new static XML Deserialize(ResourceInfo resourceInfo, ushort version, uint slotRamRequired, uint slotVRamRequired, uint otherRamRequired, uint otherVRamRequired, ulong?nameHash, byte[] rawData, IMapper mapper) { XML xml = mapper.Map <XML>(Resource.Deserialize(resourceInfo, version, slotRamRequired, slotVRamRequired, otherRamRequired, otherVRamRequired, nameHash, rawData, null)); using (MemoryStream memory = new MemoryStream(rawData)) { xml.TargetModule = memory.ReadString((int)memory.ReadUInt32()); xml.Unknown8 = memory.ReadUInt8(); xml.Path = memory.ReadString((int)memory.ReadUInt32()); if (xml.Path != xml.Info.SourceDataDescription) { xml.Info.SourceDataDescription = xml.Path; } xml.Unknown16 = memory.ReadUInt16(); if (xml.Unknown16 != 1024) { xml.rawUnsolved = rawData; return(xml); } uint nodesCount = memory.ReadUInt32(); byte[] valuesDb = new byte[memory.ReadUInt32()]; memory.Read(valuesDb, 0, valuesDb.Length); using (MemoryStream valuesDbStream = new MemoryStream(valuesDb)) { for (int i = 0; i < nodesCount; i++) { Node node = new Node(); uint nameOffset = memory.ReadUInt32(); valuesDbStream.Seek(nameOffset, SeekOrigin.Begin); node.Name.Type = valuesDbStream.ReadUInt32(); node.Name.Unknown32 = valuesDbStream.ReadUInt32(); node.Name.Value = valuesDbStream.ReadStringDynamic(); uint valueOffset = memory.ReadUInt32(); valuesDbStream.Seek(valueOffset, SeekOrigin.Begin); node.Value.Type = valuesDbStream.ReadUInt32(); node.Value.Unknown32 = valuesDbStream.ReadUInt32(); node.Value.Value = valuesDbStream.ReadStringDynamic(); node.Id = memory.ReadUInt32(); uint childCount = memory.ReadUInt32(); for (int j = 0; j < childCount; j++) { node.Childs.Add(memory.ReadUInt32()); } uint attributesCount = memory.ReadUInt32(); for (int k = 0; k < attributesCount; k++) { Node.Attribute attribute = new Node.Attribute(); uint attributeNameOffset = memory.ReadUInt32(); valuesDbStream.Seek(attributeNameOffset, SeekOrigin.Begin); attribute.Name.Type = valuesDbStream.ReadUInt32(); attribute.Name.Unknown32 = valuesDbStream.ReadUInt32(); attribute.Name.Value = valuesDbStream.ReadStringDynamic(); uint attributeValueOffset = memory.ReadUInt32(); valuesDbStream.Seek(attributeValueOffset, SeekOrigin.Begin); attribute.Value.Type = valuesDbStream.ReadUInt32(); attribute.Value.Unknown32 = valuesDbStream.ReadUInt32(); attribute.Value.Value = valuesDbStream.ReadStringDynamic(); node.Attributes.Add(attribute); } xml._nodes.Add(node); } } } return(xml); }