Ejemplo n.º 1
0
        private static Dna ParseElement(ref Dna pCurrent, string cElement, string cElementData)
        {
            Dna pRetVal = pCurrent;

            if (pRetVal != null)
            {
                bool bOneTag = (cElement.Substring(cElement.Length - 2, 2) == "/>");

                if ((cElementData.IndexOf(" ") > 0) && (cElement.IndexOf("=") > 0))
                {
                    cElement = cElement.Replace("\x00D\x00A", " ");
                    cElement = cElement.Replace("\t", " ");
                    int nStart = cElement.IndexOf(" ");
                    string cNewTag = cElement.Substring(1, nStart - 1).Trim();
                    string cData = cElement.Substring(nStart + 1, cElement.Length - nStart - 1); // fix this

                    if (bOneTag)
                        cData = cData.Substring(1); // fix this

                    cData += " ";
                    pRetVal = pRetVal.PlaceParsedData("<" + cNewTag + ">", cElement);
                    cData = ClearWhiteSpace(cData);
                    int nPipe = cData.IndexOf("=");

                    while ((pRetVal != null) && (nPipe >= 0))
                    {
                        string cName = "<" + cData.Substring(0, nPipe).Trim() + ">";
                        string cValue;
                        cData = cData.Substring(nPipe + 1);

                        if (cData.Substring(0, 1) == "\"")
                        {
                            nPipe = cData.IndexOf("\"", 1);
                            cValue = cData.Substring(1, nPipe - 1).Trim();
                        }
                        else if (cData.Substring(0, 1) == "'")
                        {
                            nPipe = cData.IndexOf(" ");
                            cValue = cData.Substring(1, nPipe - 1).Trim();
                        }
                        else
                        {
                            nPipe = cData.IndexOf(" ");
                            cValue = StringTools.SubStr(cData, 0, nPipe).Trim();
                        }

                        if (nPipe > 0)
                            pRetVal = pRetVal.PlaceParsedData(cName, cValue);

                        cData = StringTools.SubStr(cData, nPipe + 1);
                        cData = ClearWhiteSpace(cData);
                        nPipe = cData.IndexOf("=");
                    }

                    if (bOneTag)
                        if (pRetVal != null) pRetVal = pRetVal.PlaceParsedData("</" + cNewTag + ">", "");
                }
                else if (bOneTag)
                    pRetVal = pCurrent;
                else
                    pRetVal = pCurrent.PlaceParsedData(cElement, cElementData);
            }

            return pRetVal;
        }
Ejemplo n.º 2
0
        /*
        private enum enum_section
        {
            VERSION = 0,
            NONE = 1,
            STARTTAG = 2,
            ENDTAG = 3,
            INFO = 4,
            CDATA = 5
        }

        private enum enum_error
        {
            LAST_ELEMENT_NOT_END_TAG = 0,
            INVALID_ESCAPE_SEQUENCE = 1,
            EMPTY_XML_STRING = 2,
            CHARS_AFTER_LAST_END_TAG = 3
        }
        */
        public bool Parse(string cXml, Dna pCurrent)
        {
            bool bGoodParse = true;
            string cSendTag;
            int nStart = 0;
            Dna pOldCurrent = pCurrent;

            if (cXml != null)
                if (pCurrent != null)
                    try
                    {
                        int nEnd;

                        while ((nEnd = cXml.IndexOf(">", nStart)) >= 0)
                        {
                            if (pCurrent == null)
                                pCurrent = pOldCurrent;

                            int nStartTagLeft = nStart;
                            nStart = ++nEnd;

                            if (nStart >= cXml.Length)
                                break;

                            cSendTag = cXml.Substring(nStartTagLeft, nEnd - nStartTagLeft).Trim();
                            bool bCdata = false;

                            while ((cXml[nStart] == ' ') || (cXml[nStart] == '\t'))
                                ++nStart;

                            if (nStart >= cXml.Length)
                                break;

                            if ((cXml[nStart] != '<') ||
                                ((cXml[nStart + 1] == '!') && (bCdata = (cXml.Substring(nStart + 2, 7) == "[CDATA["))))
                            {
                                nStart = nEnd;
                                nEnd = cXml.IndexOf("</", nStart);

                                if ((nEnd >= 0) && (nStart != nEnd))
                                {
                                    string cInfo;

                                    if (!bCdata)
                                        cInfo = cXml.Substring(nStart, nEnd - nStart);
                                    else
                                    {
                                        int nCdataRight;

                                        if ((nCdataRight = cXml.IndexOf("]]>", nStart + 9)) >= 0)
                                        {
                                            while ((cXml[nStart] == ' ') || (cXml[nStart] == '\t'))
                                                ++nStart;

                                            cInfo = cXml.Substring(nStart + 9, nCdataRight - nStart - 9);
                                        }
                                        else
                                            cInfo = ""; // bad CData section
                                    }

                                    nEnd = cXml.IndexOf(">", nEnd + 2);
                                    nStart = ++nEnd;
                                    pCurrent = ParseElement(ref pCurrent, cSendTag, cInfo);
                                }

                                if ((nEnd >= 0) && (cXml.Substring(nEnd, 2) == "</"))
                                {
                                    while ((nEnd >= 0) && ((nEnd = cXml.IndexOf("<", nEnd + 2)) >= 0))
                                    {
                                        cSendTag = cXml.Substring(nStart, nEnd - nStart); // + 1
                                        pCurrent = pCurrent.PlaceParsedData(cSendTag, "");
                                        nStart = ++nEnd;

                                        if ((nEnd >= cXml.Length) || (cXml.IndexOf("</", nEnd) < 0))
                                            break;
                                    }
                                }
                            }
                            else
                            {
                                // send object start tag
                                pOldCurrent = pCurrent;
                                pCurrent = ParseElement(ref pCurrent, cSendTag, "");

                                if (pCurrent == null)
                                {
                                    pCurrent = pOldCurrent;
                                    string cEndTag = cSendTag.Substring(0, 1) + "/" + cSendTag.Substring(1);
                                    int nTemp = cXml.IndexOf(cEndTag, nStart);

                                    if (nTemp >= 0)
                                    {
                                        nStart = nTemp + cEndTag.Length;
                                        nEnd = nStart;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        ErrorMessage = "XMLParse Exception: " + e.Message;
                        bGoodParse = false;
                    }

            return bGoodParse;
        }
Ejemplo n.º 3
0
 ///<summary>
 ///</summary>
 ///<param name="parent"></param>
 ///<param name="endTagName"></param>
 public void SetParentDna(Dna parent, string endTagName)
 {
     pParentDna = parent;
     cEndTagName = endTagName;
 }