private void ParseLinkTags(ref string strText) { if (string.IsNullOrEmpty(strText)) { _ResetLinkTags(0); return; } mUnderlineTagInfos.Clear(); LinkCache linkCache = null; if (m_SupportCache) { linkCache = CacheManager.Instance.GetLinkCache(strText.GetHashCode()); if (linkCache != null) { for (int i = 0; i < linkCache.GetParams().Count; ++i) { LinkCache.CacheLinkTag tag = linkCache.GetParams()[i]; LinkTag selftag = _GetLinkTag(i); selftag.SetStartIndex(tag.StartIndex); selftag.SetEndIndex(tag.EndIndex); mUnderlineTagInfos.Add(selftag); if (tag.paramDic != null) { var iter = tag.paramDic.GetEnumerator(); while (iter.MoveNext()) { selftag.CheckSetValue(iter.Current.Key, iter.Current.Value); } iter.Dispose(); } } strText = linkCache.GetResultString(); _ResetSpriteTags(linkCache.GetParams().Count); return; } } int linkCount = 0; mTextBuilder.Length = 0; XMLIterator.Begin(strText, false); string textBlock = string.Empty; mTagPos.Clear(); while (XMLIterator.NextTag()) { mParses.Clear(); if (XMLIterator.tagName == mLinkTag) { textBlock = XMLIterator.GetText(false); if (!mTagPos.ContainsKey(mLinkTag)) { XMLIterator.tagOffset += XMLIterator.tagOffset; mTagPos[mLinkTag] = (XMLIterator.parsePos - XMLIterator.tagOffset) * 4; LinkTag tag = _GetLinkTag(lineCount); mUnderlineTagInfos.Add(tag); tag.SetStartIndex(mTagPos[mLinkTag]); XMLIterator.GetAttributes(mParses); foreach (var val in mParses) { tag.CheckSetValue(val.Key, val.Value); } } else { LinkTag tag = _GetLinkTag(lineCount); XMLIterator.tagOffset += XMLIterator.tagLength; tag.SetEndIndex((XMLIterator.parsePos - XMLIterator.tagOffset) * 4); mTagPos.Remove(mLinkTag); if (m_SupportCache) { linkCache = CacheManager.Instance.AddLinkCache(strText.GetHashCode()); LinkCache.CacheLinkTag cacheTag = new LinkCache.CacheLinkTag(); cacheTag.StartIndex = tag.GetStartIndex(); cacheTag.EndIndex = tag.GetEndIndex(); if (cacheTag.paramDic == null) { cacheTag.paramDic = new Dictionary <string, string>(); } var iter = tag.GetParams().GetEnumerator(); while (iter.MoveNext()) { cacheTag.paramDic.Add(iter.Current.Key, iter.Current.Value); } linkCache.AddParams(cacheTag); } ++lineCount; } } else { textBlock = XMLIterator.GetText(false); mTextBuilder.Append(textBlock); mTextBuilder.Append(XMLIterator.GetTagSource()); } } textBlock = XMLIterator.GetText(false); mTextBuilder.Append(textBlock); string result = mTextBuilder.ToString(); if (m_SupportCache) { linkCache = CacheManager.Instance.GetLinkCache(strText.GetHashCode()); if (linkCache != null) { linkCache.SetResultString(result); } } strText = result; _ResetLinkTags(linkCount); }
void Parse(string aSource) { XML lastOpenNode = null; sNodeStack.Clear(); XMLIterator.Begin(aSource); while (XMLIterator.NextTag()) { if (XMLIterator.tagType == XMLTagType.Start || XMLIterator.tagType == XMLTagType.Void) { XML childNode; if (lastOpenNode != null) { childNode = new XML(); } else { if (this.name != null) { Cleanup(); throw new Exception("Invalid xml format - no root node."); } childNode = this; } childNode.name = XMLIterator.tagName; childNode._attributes = XMLIterator.GetAttributes(childNode._attributes); if (lastOpenNode != null) { if (XMLIterator.tagType != XMLTagType.Void) { sNodeStack.Push(lastOpenNode); } if (lastOpenNode._children == null) { lastOpenNode._children = new XMLList(); } lastOpenNode._children.Add(childNode); } if (XMLIterator.tagType != XMLTagType.Void) { lastOpenNode = childNode; } } else if (XMLIterator.tagType == XMLTagType.End) { if (lastOpenNode == null || lastOpenNode.name != XMLIterator.tagName) { Cleanup(); throw new Exception("Invalid xml format - <" + XMLIterator.tagName + "> dismatched."); } if (lastOpenNode._children == null || lastOpenNode._children.Count == 0) { lastOpenNode.text = XMLIterator.GetText(); } if (sNodeStack.Count > 0) { lastOpenNode = sNodeStack.Pop(); } else { lastOpenNode = null; } } } }