[ASP.NET / C#] XML Stream selectief uitlezen

Pagina: 1
Acties:

  • TricTrac
  • Registratie: November 2000
  • Laatst online: 06-10-2025
Ik heb een database waarin tekstvelden staan. Deze tekstvelden bevatten html tags voor opmaak zoals <p>, <a>, <li> etc.
De tekst bevat echter ook tags waar ik wat mee wil doen, welke in mijn geval zijn:
<crosslink>, <internalhyperlink>, <footnote>, <mark> & <externalhyperlink>
Bij het meerendeel van deze tags moet de xml omgezet worden in een hyperlink. Dat is geen probleem.

Ik haal de tekst uit de database en stop deze in een string. De string wordt in een stream gestopt en wordt uitgelezen als XML. Nu wil ik de xlink tags filteren en vervangen door html maar ik wil de rest van de tekst wat al HTML is laten voor wat het is.
Alles werkt nu wel maar ik raak dus mijn HTML opmaak kwijt tijdens het doorlopen van de stream.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    //tekst wordt meegegeven bij aanroepen van de functie. plannummer en identificatie worden alleen gebruikt bij de opbouw van een hyperlink.
    public string XMLReader(string text, string plannummer, string identificatie)
    {
        StringReader stream;

        //output van de functie declareren
        string output = null;

        StringBuilder sb = new StringBuilder();

        //zorg ervoor dat de XML een root element heeft
        text = "<root>" + text + "</root>";

        stream = new StringReader(text);
        XmlTextReader reader = new XmlTextReader(stream);
        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.Name == "p" && reader.NodeType == XmlNodeType.Element)
            {
                //handmatige toevoeging van de <p> tags. Dit wil ik op één of andere manier automatisch hebben als het niet om een xlink tag gaat
                output = output + "<p>" + reader.ReadString();
            }
            if (reader.Name == "crosslink")
            {
                string link = reader.GetAttribute("refid");
                string titel = reader.ReadString();

                output = output + "<a href='Default.aspx?plannummer=" + plannummer + "&identificatie=" + identificatie + "&text_detail=" + link + "'>" + titel + "</a>"; 
            }
            if (reader.Name == "p" && reader.NodeType == XmlNodeType.EndElement)
            {

                output = output + "</p>";
            }
        }
        return output;

    }


Is er een manier om alle tags die gewoon html zijn te laten voor wat ze zijn en ze compleet toe te voegen in de output string zonder alles handmatig in te voeren?

[ Voor 8% gewijzigd door TricTrac op 24-05-2006 11:29 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:21
kan je die boel niet in een xmlDocument inladen, en dan mbhv xpath gaan zoeken ?

https://fgheysels.github.io/


  • TricTrac
  • Registratie: November 2000
  • Laatst online: 06-10-2025
't gaat vaak om nogal grote teksten dus leek me XMLTekstReader de betere oplossing. De kans is ook groot dat de applicatie veelvuldig gebruikt gaat worden en zou ik graag willen dat de snelheid ook nog een beetje fatsoenlijk blijft. Aangezien XMLDocument naar wat ik gelezen heb een stuk trager is als XMLTekstReader heb ik in eerste instatie voor XMLTekstReader gekozen..

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Bij het maken van een XmlReader instance heb je de mogelijkheid om een XmlReaderSettings object mee te geven. Dit object bevat allerlei instellingen en ik denk de instelling CheckCharacters (op false) je hierin kan helpen.

Weet niet zeker, maar misschien stuur ik je hiermee de goede kant op.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Kun je niet iets van het volgende proberen
C#:
1
2
3
4
5
6
7
8
9
10
11
while (reader.Read())
        {
            if ( isCustomTag( reader.Name ) ) // dit is een zelfgeschreven methode die checkt of het een crosslink, ... etc is
            {
                 // doe je custom rommel
            }
            else // hier kom je dus als het een standaard html tag is
            {
                  // check of het een begin of een eind tag is en plaats bijbehorende html tag opnieuw
            }
        } 

  • TricTrac
  • Registratie: November 2000
  • Laatst online: 06-10-2025
heb net een oplossing getest en deze blijkt te werken. Ik heb alle html tags in een string array geplaatst.
Voor de eerste if in de while loop kijk ik met Array.BinarySearch of de waarde op een lokatie staat in de array (als ie er niet in staat krijg ik een waarde -1 terug).
Als de waarde dus niet -1 is dan voer ik de code uit voor html.. Als het een andere waarde heeft kijk ik welke tag het wel is..

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public string XMLReader(string text, string plannummer, string identificatie)
    {
        StringReader stream;
        string output = null;
        StringBuilder sb = new StringBuilder();
        text = "<root>" + text + "</root>";
        stream = new StringReader(text);
        XmlTextReader reader = new XmlTextReader(stream);
        XmlReaderSettings settings = new XmlReaderSettings();
        int index;

        string[] xmlMapPath = { "a", "b", "i", "li", "ol", "p", "s", "sub", "sup", "table", "td", "tr", "u", "ul", "br" };
        reader.MoveToContent();
        while (reader.Read())
        {
            index = Array.BinarySearch(xmlMapPath, reader.Name);
            if (index != -1 && reader.NodeType == XmlNodeType.Element)
            {
                output = output + "<" + reader.Name + ">" + reader.ReadString();
            }
            if (reader.Name == "crosslink")
            {
                string link = reader.GetAttribute("refid");
                string titel = reader.ReadString();

                output = output + "<a href='Default.aspx?plannummer=" + plannummer + "&identificatie=" + identificatie + "&text_detail=" + link + "'>" + titel + "</a>"; 
            }
            if (index != -1 && reader.NodeType == XmlNodeType.EndElement)
            {
                output = output + "</" + reader.Name + ">";
            }
        }
        return output;

    }


zo lijkt hij te werken.. uiteraard nog wel wat extra testen..

[ Voor 14% gewijzigd door TricTrac op 24-05-2006 14:32 ]

Pagina: 1