private bool isMixedContent(DTDItem dtdItem)
        {
            if (dtdItem is DTDAny)
            {
                return(false);
            }
            else if (dtdItem is DTDEmpty)
            {
                return(false);
            }
            else if (dtdItem is DTDName)
            {
                return(false);
            }
            else if (dtdItem is DTDChoice)
            {
                List <DTDItem> items = ((DTDChoice)dtdItem).Items;
                foreach (DTDItem item in items)
                {
                    bool b = isMixedContent(item);
                    if (b)
                    {
                        return(true);
                    }
                }
            }
            else if (dtdItem is DTDSequence)
            {
                List <DTDItem> items = ((DTDSequence)dtdItem).Items;
                foreach (DTDItem item in items)
                {
                    bool b = isMixedContent(item);
                    if (b)
                    {
                        return(true);
                    }
                }
            }
            else if (dtdItem is DTDMixed)
            {
                List <DTDItem> items = ((DTDMixed)dtdItem).Items;
                foreach (DTDItem item in items)
                {
                    bool b = isMixedContent(item);
                    if (b)
                    {
                        return(true);
                    }
                }
            }
            else if (dtdItem is DTDPCData)
            {
                return(true);
            }
            else
            {
#if DEBUG
                Debugger.Break();
#endif // DEBUG
            }

            return(false);
        }
Ejemplo n.º 2
0
        private static void GenerateRegexForAllowedChildren(StringBuilder stringBuilder, DTDItem dtdItem)
        {
            if (dtdItem is DTDAny)
            {
                stringBuilder.Append("");// "Any";
            }
            else if (dtdItem is DTDEmpty)
            {
                stringBuilder.Append("");
            }
            else if (dtdItem is DTDName)
            {
                stringBuilder.Append("(?:");
                string name = ((DTDName)dtdItem).Value;
                name = name.Replace(':', NAMESPACE_PREFIX_SEPARATOR);
                stringBuilder.Append(Regex.Escape(name));
                stringBuilder.Append(DELIMITER);
                stringBuilder.Append(")");
            }
            else if (dtdItem is DTDChoice)
            {
                List <DTDItem> items = ((DTDChoice)dtdItem).Items;
                if (items.Count > 1)
                {
                    stringBuilder.Append("(?:");
                }

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        stringBuilder.Append("|");
                    }
                    isFirst = false;

                    GenerateRegexForAllowedChildren(stringBuilder, item);
                }
                if (items.Count > 1)
                {
                    stringBuilder.Append(")");
                }
            }
            else if (dtdItem is DTDSequence)
            {
                List <DTDItem> items = ((DTDSequence)dtdItem).Items;
                if (items.Count > 1)
                {
                    stringBuilder.Append("(?:");
                }

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        stringBuilder.Append("");
                    }
                    GenerateRegexForAllowedChildren(stringBuilder, item);
                    isFirst = false;
                }
                if (items.Count > 1)
                {
                    stringBuilder.Append(")");
                }
            }
            else if (dtdItem is DTDMixed)
            {
                List <DTDItem> items = ((DTDMixed)dtdItem).Items;
                if (items.Count > 1)
                {
                    stringBuilder.Append("(?:");
                }

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        stringBuilder.Append("|");
                    }

                    GenerateRegexForAllowedChildren(stringBuilder, item);
                    isFirst = false;
                }
                if (items.Count > 1)
                {
                    stringBuilder.Append(")");
                }
            }
            else if (dtdItem is DTDPCData)
            {
                stringBuilder.Append(Regex.Escape(PCDATA));
            }
            else
            {
                //DebugFix.Assert(false);
#if DEBUG
                Debugger.Break();
#endif // DEBUG
                stringBuilder.Append(Regex.Escape(UNKNOWN));
            }

            if (dtdItem.Cardinal == DTDCardinal.ZEROONE)
            {
                stringBuilder.Append("?");
            }
            else if (dtdItem.Cardinal == DTDCardinal.ZEROMANY)
            {
                stringBuilder.Append("*");
            }
            else if (dtdItem.Cardinal == DTDCardinal.ONEMANY)
            {
                stringBuilder.Append("+");
            }
        }
        private void initMixedContentXmlElementNamesFromDTD(string dtdUniqueResourceId, Stream dtdStream)
        {
            List <string> list;

            m_listOfMixedContentXmlElementNames.TryGetValue(dtdUniqueResourceId, out list);

            DebugFix.Assert(list != null);

            if (list == null)
            {
                return;
            }

            DTD dtd = null;

            try
            {
                // NOTE: the Stream is automatically closed by the parser, see Scanner.ReadNextChar()
                DTDParser parser = new DTDParser(new StreamReader(dtdStream, Encoding.UTF8));
                dtd = parser.Parse(true);
            }
            catch (Exception ex)
            {
#if DEBUG
                Debugger.Break();
#endif
                dtdStream.Close();
            }

            if (dtd != null)
            {
                foreach (DictionaryEntry entry in dtd.Elements)
                {
                    DTDElement dtdElement = (DTDElement)entry.Value;
                    DTDItem    item       = dtdElement.Content;
                    if (isMixedContent(item))
                    {
                        if (!list.Contains(dtdElement.Name))
                        {
                            list.Add(dtdElement.Name);
                        }
                    }
                }


                foreach (DictionaryEntry entry in dtd.Entities)
                {
                    DTDEntity dtdEntity = (DTDEntity)entry.Value;

                    if (dtdEntity.ExternalId == null)
                    {
                        continue;
                    }

                    string system = dtdEntity.ExternalId.System;
                    if (dtdEntity.ExternalId is DTDPublic)
                    {
                        string pub = ((DTDPublic)dtdEntity.ExternalId).Pub;
                        if (!string.IsNullOrEmpty(pub))
                        {
                            system = pub; //.Replace(" ", "%20");
                        }
                    }

                    string normalisedUri = system.Replace("%20", " ").Replace(" //", "//").Replace("// ", "//");

                    foreach (String key in DTDs.DTDs.ENTITIES_MAPPING.Keys)
                    {
                        if (normalisedUri.Contains(key))
                        {
                            string subResource = DTDs.DTDs.ENTITIES_MAPPING[key];
                            Stream stream      = DTDs.DTDs.Fetch(subResource);

                            if (stream != null)
                            {
                                initMixedContentXmlElementNamesFromDTD(dtdUniqueResourceId, stream);
                            }
                            else
                            {
#if DEBUG
                                Debugger.Break();
#endif
                            }

                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        private static string GenerateRegexForAllowedChildren(DTDItem dtdItem)
        {
            string regexStr = "";

            if (dtdItem is DTDAny)
            {
                regexStr += "";// "Any";
            }
            else if (dtdItem is DTDEmpty)
            {
                regexStr += "";
            }
            else if (dtdItem is DTDName)
            {
                regexStr += "(?:" + ((DTDName)dtdItem).Value + "#)";
                //regexStr += "(" + ((DTDName)dtdItem).Value + "#)";
            }
            else if (dtdItem is DTDChoice)
            {
                List <DTDItem> items = ((DTDChoice)dtdItem).Items;
                //if (items.Count > 1) regexStr += "(?:";
                if (items.Count > 1)
                {
                    regexStr += "(";
                }

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        regexStr += "|";
                    }
                    isFirst   = false;
                    regexStr += GenerateRegexForAllowedChildren(item);
                }
                if (items.Count > 1)
                {
                    regexStr += ")";
                }
            }
            else if (dtdItem is DTDSequence)
            {
                List <DTDItem> items = ((DTDSequence)dtdItem).Items;
                if (items.Count > 1)
                {
                    regexStr += "(?:";
                }
                //if (items.Count > 1) regexStr += "(";

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        regexStr += "";
                    }
                    regexStr += GenerateRegexForAllowedChildren(item);
                    isFirst   = false;
                }
                if (items.Count > 1)
                {
                    regexStr += ")";
                }
            }
            else if (dtdItem is DTDMixed)
            {
                List <DTDItem> items = ((DTDMixed)dtdItem).Items;
                if (items.Count > 1)
                {
                    regexStr += "(?:";
                }
                //if (items.Count > 1) regexStr += "(";

                bool isFirst = true;
                foreach (DTDItem item in items)
                {
                    if (!isFirst)
                    {
                        regexStr += "|";
                    }
                    regexStr += GenerateRegexForAllowedChildren(item);
                    isFirst   = false;
                }
                if (items.Count > 1)
                {
                    regexStr += ")";
                }
            }
            else if (dtdItem is DTDPCData)
            {
                regexStr += "#PCDATA";
            }
            else
            {
                regexStr += "**UNKNOWN**";
            }
            if (dtdItem.Cardinal == DTDCardinal.ZEROONE)
            {
                regexStr += "?";
            }
            else if (dtdItem.Cardinal == DTDCardinal.ZEROMANY)
            {
                regexStr += "*";
            }
            else if (dtdItem.Cardinal == DTDCardinal.ONEMANY)
            {
                regexStr += "+";
            }
            return(regexStr);
        }