public static DsoChatPacket Parse(string rawXmlData, byte[] rawData) { PacketLogger.LogPacket(rawXmlData); string xmlBody = SkipHeader(rawXmlData); if (string.IsNullOrEmpty(xmlBody)) { // Failed to match against XML // Try AMF DsoChatPacket amfPacket; if ((amfPacket = TryParseAmf(rawXmlData, rawData)) == null) { return(null); } return(amfPacket); } if (BodyDetection.IsMatch(xmlBody) == false) { return(null); } PacketLogger.LogChatPacket(xmlBody); // Remove namespaces.. xmlBody = Regex.Replace(xmlBody, " xmlns=(\"|')[^\"']*(\"|')", ""); // Get all messages MatchCollection matches = RegexMessages.Matches(xmlBody); if (matches == null || matches.Count == 0) { return(null); } // Build our xml struct // <body><messages>...</messages></body> string validXml = "<body><messages>"; foreach (Match match in matches) { validXml += match.Value; } validXml += "</messages></body>"; // Deserialize try { XmlSerializer serializer = new XmlSerializer(typeof(DsoChatPacket)); using (StringReader stringStream = new StringReader(validXml)) { DsoChatPacket doc = (DsoChatPacket)serializer.Deserialize(stringStream); return(doc); } } catch { // Incomplete packet maybe.. return(null); } }