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);
        }
示例#2
0
 internal DomAttribute(Node.Attribute node)
     : base(node.Prefix, node.LocalName, node.NamespaceUri, (XmlDocument)node.Document.XmlNode)
 {
     _node = node;
 }
示例#3
0
        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);
        }
示例#4
0
 internal DomAttribute(Node.Attribute node)
     : base(node.Prefix, node.LocalName, node.NamespaceUri, (XmlDocument)node.Document.XmlNode)
 {
     _node = node;
 }