internal void WriteProps(FastString sb) { if (properties == null || properties.Length == 0) { return; } sb.Append(" "); foreach (XmlProperty kv in properties) { //if (string.IsNullOrWhiteSpace(kv.Key)) if (String.IsNullOrEmpty(kv.Key) || kv.Key.Trim().Length == 0) { continue; } sb.Append(kv.Key); sb.Append("=\""); sb.Append(Converter.ToXml(kv.Value)); sb.Append("\" "); } sb.Length--; }
private void WriteItem(XmlItem item, int level) { FastString sb = new FastString(); // start if (autoIndent) { sb.Append(Dup(level)); } sb.Append("<"); sb.Append(item.Name); // text item.WriteProps(sb); // end if (item.Count == 0 && item.Value == "") { sb.Append("/>"); } else { sb.Append(">"); } // value if (item.Count == 0 && item.Value != "") { sb.Append(Converter.ToXml(item.Value, false)); sb.Append("</"); sb.Append(item.Name); sb.Append(">"); } WriteLn(sb.ToString()); }
private bool ReadValue(XmlItem item) { FastString builder; if (Config.IsStringOptimization) { builder = new FastStringWithPool(stringPool); } else { builder = new FastString(); } ReadState state = ReadState.FindLeft; string lastName = "</" + this.lastName + ">"; int lastNameLength = lastName.Length; do { int c = reader.Read(); if (c == -1) { RaiseException(); } builder.Append((char)c); if (state == ReadState.FindLeft) { if (c == '<') { symbolInBuffer = '<'; return(false); } else if (c != ' ' && c != '\r' && c != '\n' && c != '\t') { state = ReadState.FindCloseItem; } } else if (state == ReadState.FindCloseItem) { if (builder.Length >= lastNameLength) { bool match = true; for (int j = 0; j < lastNameLength; j++) { if (builder[builder.Length - lastNameLength + j] != lastName[j]) { match = false; break; } } if (match) { builder.Length -= lastNameLength; item.Value = Converter.FromXml(builder.ToString()); return(true); } } } }while (true); }
private ItemState ReadItem(XmlItem item) { FastString builder; if (Config.IsStringOptimization) { builder = new FastStringWithPool(stringPool); } else { builder = new FastString(); } ReadState state = ReadState.FindLeft; int comment = 0; int i = 0; //string tempAttrName = null; //int lc = -1; int c = -1; // find < c = readNextSymbol(); while (c != -1) { if (c == '<') { break; } c = readNextSymbol(); } //while not end while (state != ReadState.Done && c != -1) { // find name or comment; c = readNextSymbol(); i = 0; while (c != -1) { if (i <= comment) { switch (comment) { case 0: if (c == '!') { comment++; } break; case 1: if (c == '-') { comment++; } break; case 2: if (c == '-') { state = ReadState.FindComment; } break; default: comment = -1; break; } if (state == ReadState.FindComment) { break; } } i++; switch (c) { case '>': state = ReadState.Done; break; //Found name case ' ': state = ReadState.FindRight; break; //Found name case '<': RaiseException(); break; default: builder.Append((char)c); break; } if (state != ReadState.FindLeft) { break; } c = readNextSymbol(); } switch (state) { case ReadState.FindComment: comment = 0; while (c != -1) { c = readNextSymbol(); if (comment > 1) { if (c == '>') { state = ReadState.FindLeft; break; } } else { if (c == '-') { comment++; } else { comment = 0; } } } comment = 0; builder.Length = 0; while (c != -1) { if (c == '<') { break; } c = readNextSymbol(); } break; case ReadState.Done: string result = builder.ToString(); if (result[0] == '/') { item.Name = result.Substring(1); return(ItemState.End); } if (result[result.Length - 1] == '/') { item.Name = result.Substring(0, result.Length - 1); return(ItemState.Complete); } item.Name = result; return(ItemState.Begin); case ReadState.FindRight: if (builder[0] == '/') { builder.Remove(0, 1); item.Name = builder.ToString(); return(ItemState.End); } item.Name = builder.ToString(); builder.Length = 0; while (c != -1 && c != '>') { c = readNextSymbol(); while (c != -1) { if (c == ' ') { builder.Length = 0; c = readNextSymbol(); continue; } if (c == '=' || c == '>') { break; } builder.Append((char)c); c = readNextSymbol(); } if (c == '>') { if (builder.Length > 0 && builder[builder.Length - 1] == '/') { return(ItemState.Complete); } return(ItemState.Begin); } c = readNextSymbol(); if (c != '"') { continue; } string attrName = builder.ToString(); builder.Length = 0; while (c != -1) { c = readNextSymbol(); if (c == '"') { break; } builder.Append((char)c); } item.SetProp(attrName, Converter.FromXml(builder.ToString())); builder.Length = 0; } break; } } //just for errors return(ItemState.Begin); }