Hey, der Code von gestern ist mehr oder weniger Schrott und ein einziger Bottleneck.
Der hier ist sauberer und logischer:
Spoiler anzeigen
Aufruf:
Ergibt:
DOM -> HTML
............-> p {<hr>, HELLO, <hr>}
............-> div {rofl, <p>}
....................-> p{x}
Ist sicher auch schneller denn: Technisch gesehen wird hier durchweg nur ein einzige Schleife verwendet (die obige Variante nutzte zig).
Wer's braucht, hat's jetzt.
Addendum:
Jap, hab's getestet. Scheint mehr oder weniger zu funktionieren und das echt schnell.
Addendum II:
Der Code hat ein Bug, lässt sich aber _ relativ schnell korrigieren. Wer's wissen will mag mich anschreiben.
_
Der hier ist sauberer und logischer:
C#-Quellcode
- public class DOMObject
- {
- public DOMObject Parent;
- public StringBuilder Begin = new StringBuilder();
- public StringBuilder End = new StringBuilder();
- public StringBuilder Attribute = new StringBuilder();
- public int Index;
- public List<DOMObject> Childs = new List<DOMObject>();
- public StringBuilder Content = new StringBuilder();
- public void Process(bool find)
- {
- string _begin = "";
- bool findEnd = false;
- bool findAttribute = false;
- for (int i = Index; i < Program.HTML.Length - 1; i++)
- {
- char c = Program.HTML[i];
- char c_1 = Program.HTML[i + 1];
- if (find)
- {
- if (c == '>')
- {
- _begin = Begin.ToString();
- find = false;
- if (!Program.Tags.Contains(_begin))
- {
- Parent.Index = i;
- return;
- }
- }
- else
- {
- if (c == ' ')
- {
- findAttribute = true;
- continue;
- }
- if (findAttribute)
- Attribute.Append(c);
- else
- Begin.Append(c);
- }
- }
- else
- {
- if (c == '/')
- findEnd = true;
- if (findEnd)
- {
- if (c == '>')
- {
- Parent.Index = i;
- return;
- }
- End.Append(c);
- }
- }
- if (!find && !findEnd && c != '<' && c != '>')
- Content.Append(c);
- if (c == '<' && c_1 != '/')
- {
- Content.Append('!');
- DOMObject child = new DOMObject()
- {
- Parent = this,
- Index = i + 1
- };
- Childs.Add(child);
- Childs[Childs.Count - 1].Process(true);
- i = Index;
- }
- }
- }
- public override string ToString()
- {
- return Begin.ToString();
- }
- }
Aufruf:
C#-Quellcode
- public static string HTML = "<html id=lol><p><hr>HALLO<hr></p><div>rofl</div></html>";
- public static HashSet<string> Tags = new HashSet<string>();
- static void Main(string[] args)
- {
- HTML += ";";
- Tags.Add("html");
- Tags.Add("p");
- Tags.Add("div");
- DOMObject dom = new DOMObject();
- dom.Process(false);
- Console.Read();
- }
Ergibt:
DOM -> HTML
............-> p {<hr>, HELLO, <hr>}
............-> div {rofl, <p>}
....................-> p{x}
Ist sicher auch schneller denn: Technisch gesehen wird hier durchweg nur ein einzige Schleife verwendet (die obige Variante nutzte zig).
Wer's braucht, hat's jetzt.
Addendum:
Jap, hab's getestet. Scheint mehr oder weniger zu funktionieren und das echt schnell.
Addendum II:
Der Code hat ein Bug, lässt sich aber _ relativ schnell korrigieren. Wer's wissen will mag mich anschreiben.
_
Und Gott alleine weiß alles am allerbesten und besser.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „φConst“ ()