none
Problém s XmlTextReader.Read()

    Dotaz

  • Ahoj.. mám následující kód:

     

    System.Xml.XmlTextReader xr = new System.Xml.XmlTextReader(f + ".xml");
                while (xr.Read())
                {              
                  if (xr.NodeType == System.Xml.XmlNodeType.Element || xr.NodeType == System.Xml.XmlNodeType.EndElement)
                  {
                    if (xr.Name.ToLower() == "title")
                      MessageBox.Show(xr.Name, xr.NodeType + ""); // zde testuji, zda je vůbec EndElement elementu Title dostupný
                    
                    bool start = xr.IsStartElement();
                    
                    switch(xr.Name.ToLower())
                    {
                      case "title":
                        if (xr.IsStartElement())
                        {
                          MessageBox.Show(xr.ReadString());
                        }
                        else
                        {
                          MessageBox.Show("Konec elementu title"); // toto se nikdy nezobrazí, dokud nezruším xr.ReadString()
                        }
                        break;
                    }
                  }
                }
                xr.Close();
              }

    Problém spočívá v tom, že při použití metody ReadString() mi třída XmlTextReader nevrací nody typu EndElement a já nemohu na to přijít proč. Zkoušel jsem si kód vytvořit znovu, ale pořad to dělalo stejný problém. Nesetkal se s tím někdo?

     

    Díky moc.

     

    neděle 23. května 2010 10:49

Odpovědi

  • Podle dokumentace metoda ReadString() načte obsah elementu jako text, přičemž načítání textu zastaví, jakmile narazí na další značku, což může být komentář, instrukce nebo koncová značka: This could occur in a mixed content model, or when an element end tag is read. Takže při volání metody xr.ReadString() se zároveň načte i koncový element a při volání xr.Read() se načte úsek bez prostředně následující za koncovou značkou.

    Můžete to zjistit tak, když po zavolání xr.ReadString() zkontrolujete, jaký typ elementu nyní XmlTextReader zpracovává: bude to EndElement se jménem "title".


    Boris Lehečka (Word, VBA, XML, C#, SQL)
    neděle 23. května 2010 14:34
  • Ke zjištění, v jaké části dokumentu se XmlReader po zavolání metody ReadString() zrovna nachází (jestli je na konci téhož elementu nebo na začátku vnořeného), použijte hodnoty vlastností xr.NodeType a xr.Name .

    Ze všeho nejvíc ale záleží na tom, čeho chcete dosáhnout, k čemu má daný kód sloužit. Jestli jde jenom o načtení textu (stačilo by odchytávat xr.NodeType == XmlNodeType.Text ), o text a informace o počátečních a koncových značkách, jestli je potřeba zpracovávat atributy atp. Rovněž záleží na tom, jakou strukturu (DTD, XML Schema) může zpracovávaný dokument XML mít.


    Boris Lehečka (Word, VBA, XML, C#, SQL)
    neděle 23. května 2010 16:35

Všechny reakce

  • Podle dokumentace metoda ReadString() načte obsah elementu jako text, přičemž načítání textu zastaví, jakmile narazí na další značku, což může být komentář, instrukce nebo koncová značka: This could occur in a mixed content model, or when an element end tag is read. Takže při volání metody xr.ReadString() se zároveň načte i koncový element a při volání xr.Read() se načte úsek bez prostředně následující za koncovou značkou.

    Můžete to zjistit tak, když po zavolání xr.ReadString() zkontrolujete, jaký typ elementu nyní XmlTextReader zpracovává: bude to EndElement se jménem "title".


    Boris Lehečka (Word, VBA, XML, C#, SQL)
    neděle 23. května 2010 14:34
  • A dá se to nějak vyřešit? Když budu číst například jiný element, např. P, ten může obsahovat i různé subelementy a nenapadá mě způsob, jak by se to dalo zpracovat. Děkuji.
    neděle 23. května 2010 15:54
  • Ke zjištění, v jaké části dokumentu se XmlReader po zavolání metody ReadString() zrovna nachází (jestli je na konci téhož elementu nebo na začátku vnořeného), použijte hodnoty vlastností xr.NodeType a xr.Name .

    Ze všeho nejvíc ale záleží na tom, čeho chcete dosáhnout, k čemu má daný kód sloužit. Jestli jde jenom o načtení textu (stačilo by odchytávat xr.NodeType == XmlNodeType.Text ), o text a informace o počátečních a koncových značkách, jestli je potřeba zpracovávat atributy atp. Rovněž záleží na tom, jakou strukturu (DTD, XML Schema) může zpracovávaný dokument XML mít.


    Boris Lehečka (Word, VBA, XML, C#, SQL)
    neděle 23. května 2010 16:35