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); }
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; } } } } }
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); }