Share via


Чтение XML под Silverlight...

??????? ???????? ?????? XML ??? Silverlight. ???????? ??? ???? ? Webdata (??????, ??????? ??????? MSXML & System.Xml) ?, ??????? ??, ?????? ????? ????????? ? XPathNavigator... ???, ??? ??, ???????? ????... ?????????, Silverlight - ??? ???????????? .Net. ????? ??????????? ??? XPathNavigator ? ??? ?? ??????. ? ?????, ? ?????? XPathNavigator? ?? ????? ??????. ???? ? ???, ??? ??, ??? ?????? ???????? DOM ?? ????? ??????? ? ????, ??? ????? ???????? XPath (??? ??????????? ? ??????? ???????, ??????????? ?? ??? ???????? ?? ?? Microsoft, ? ?? ?????? ?????? ?????), ??????? ???????????????? ????? XPath ?? DOM ?? ?????? ???????, ? ?????? ??????????????. ?????? ? ?????? ??????? ??? ?????????????. ???? ? ???, ??? ? ???, ? ?????? ????????? ???????????? ????????? ????????? ??????. ?, ???, ??? ???????????? ?????? ??????, ??? ??? ?????????? ?? ?? ???? ????????????? ???? ? ??????, ??? ??????.

??????? ? ??? ???????? XPathNavigator, ??? ????? ?? ?? ????? ??? ? DOM, ?? ?? ????????? ????? DOM ?????????, ???? ????????? ????????? ?????? XPath, ? ?????? ??????????? ??????? ??? ????????????? XPath.

??, ?????, ??? XPathNavigator ? ?? ????, ????????? ??????? DOM, ?? ???? XmlDocument. ???! ??? ???? ???...

????? System.Xml.Linq? ????? ?? ????... ??? ?????? reference ???????? ? ??? ????? ?? ?????????????... ?????????????, ?? ?? ???????????. Linq - ??? ?? ?????? ??????????? ????? ? Silverlight, ????? ? ?? ???? ?? ?????.

??? ??? ?? ???????? ??????? ????????????? ???. XmlReader. ??????? ??, ?? ?????. ???? ?????. ????????? ??????????????????.

????, ????? ? ??? ???? XML ?????:

<

rootElem>
<elem1 attr1="1" attr2="a">
</elem1>
<elem2 attr="q"/>
<elem3 attr3="eee">
                    Some random text to show access to element content
          </elem3>
</rootElem>

??? ??? ?????? ??? ?????? XmlReader? ? ??????. 

using

System;
using System.IO;
using System.Xml;

namespace

XmlReaderTest
{
     class Program
     {
          static void Main(string[] args)
{
               FileStream fs = new FileStream("test.xml", FileMode.Open, FileAccess.Read);
               XmlReader rd = XmlReader.Create(fs);
               bool attr3flag = false;
               while (rd.Read())
{
                    if (rd.Name.Equals("rootElem"))
{
                         if (rd.IsStartElement())
{
                              Console.WriteLine("Beginning of the document");
}
                         else
                         {
                              Console.WriteLine("End of the document");
}
}
                    else if (rd.IsStartElement("elem1"))
{
                         Console.WriteLine("Attribute 1 of elem1 is {0} and attribute 2 of it is {1}",
rd.GetAttribute("attr1"), rd.GetAttribute("attr2"));
}
                    else if (rd.IsStartElement("elem2"))
{
                         Console.WriteLine("Attribute of elem2 is {0}", rd.GetAttribute("attr"));
}
                    else if (rd.IsStartElement("elem3"))
{
                         Console.WriteLine("Attribute of elem3 is {0}", rd.GetAttribute("attr3"));
attr3flag = true;
}
                    else if (rd.NodeType == XmlNodeType.Text && attr3flag)
{
attr3flag = false;
                         Console.WriteLine("Text of elem3 is {0}", rd.Value);
}
}
fs.Close();
}
}
}

? ?????, ????? ???????? ????? ???????? ? ?????????, ????????? rd.ReadToDescendant()

? ??????-?? XmlReader ?? ????? ?????, ?? ? ???????????? ????? ??????, ??????. ???? ?????.

---

????????? 3.24.08: ??????, ????????? ? ???????, Linq, ??????, ???-???? ????????, ???? ?? ?????? ????? ??????? ????????? ?????? ?????? ??????????. ???????, ??????? ????? ? ????????? ??.

Comments

  • Anonymous
    January 01, 2003
    Лучше придерживайся того, что делаешь. Обосновать все что угодно можно, а ты прав, using - очень полезная конструкция. Я ее не использовал в примере лишь потому, что открытие потока было в этом примере вообще "послемыслие" - реальный код, разумеется, получал уже открытый поток параметром. А если вспмоню, конечно, расскажу. Вместе посмеемся :-)

  • Anonymous
    January 01, 2003
    The comment has been removed

  • Anonymous
    January 01, 2003
    dm.Cat: Ну, да, именно потому... Игорь: В версию 2 XmlDocument не добавили. В основном по причинам, указанным выше dm.Cat. Гребеннков: извини, не понял. Вроде бы использую... using System.IO... Илья: XPath работает только если весь XML документ загружен в память. Ну или почти только (да-да, я сам два года проталкивал последовательный XPath, который теперь доступен, но это со своими исключениями) А на что нужен Silverlight? Ну, это не сразу видно станет. Silverlight - это активно развивающаяся платформа, а флеш - как вы справедливо заметили - допотопный. Если честно, флеш я ненавижу, даже выключаю на большинстве моих машин уже много лет. А Silverlight немного другая штука. Да и писать на нем не впример удобнее. Кстати, вы не видели демо с MIX'08? Если бы видели, у вас бы вопросов не возникали.

  • Anonymous
    January 01, 2003
    Илья: короткий ответ: не знаю. Более длинный: жизнь сложнее чем кажется. Гребенников: да, можно и так. Но вообще-то разница невелика. Еще одно идеологическое направление, которое я встречал, утверждает, что вместо using надо все засовывать в try-catch и закрывать файл в finally. В общем, кому поп, кому попадья, а кому поспорить - поп или попадья.

  • Anonymous
    January 01, 2003
    FileStream под Silverlight использовать не рекомендуется. Но WebClient тоже дает stream, вот его и используйте. А FileStream я здесь только для иллюстрации привел.

  • Anonymous
    January 01, 2003
    Красиво. И правда, вроде бы разворачивается. Надо подумать, вспомнить, чем же эти товарищи обосновывали свою конструкцию... Как вспомню - напишу.

  • Anonymous
    March 19, 2008
    А про плюсы XmlReader по сравнению с XmlDocument? Основные - скорость и размер в памяти. 10-ти метровый xml-файл загруженный в XmlDocument занимает в памяти порядка 150 мегабайт. Ну и грузит соответственно тоже долго. Наверняка поэтому и оставили возможность работы только с XmlReader. Как говориться, от греха подальше.

  • Anonymous
    March 19, 2008
    Какая версия СЛ? может во 2 бета уже добавили хмлдок

  • Anonymous
    March 19, 2008
    Эльдар, а почему ты не используешь using вот тут:   FileStream fs = new FileStream("test.xml", FileMode.Open, FileAccess.Read); ? Это конечно ничего не меняет, но как-то локоничнее и читабельнее ИМХО.

  • Anonymous
    March 19, 2008
    А почему там нет XPath? Это же вещь первой необходимости.

  • Anonymous
    March 19, 2008
    И еще - нафиг нужен Silverlight, если это в допотопном flash делается в пять раз проще? Что оно вообще умеет при таком уровне понтов? Не теоретически, а в кратких примерах?

  • Anonymous
    March 20, 2008
    Если документ порядка десяти килобайт, то никакой ровным счетом трагедии от его загрузки в память не произойдет. А вот с какой стати silverlight-приложениям работать с документами большего размера - мне неясно. Так что если они выкинули поддержку DOM из рассчета "чтобы пользователи не сломали чего", то это прискорбно, да это в любом случае прискорбно! Я рад, что он активно развивается, но если он еще не доразвивался до уровня допотопного Flash (по простоте работы с такой базовой штукой, как XML), то я за него очень рад, но помочь ничем не могу.

  • Anonymous
    March 20, 2008
    http://lj.rossia.org/users/alamar/449.html

  • Anonymous
    March 20, 2008
    >Гребеннков: извини, не понял. Вроде бы использую... using System.IO. Я имел ввиду конструкцию using(FileStream fs = new FileStream("test.xml", FileMode.Open, FileAccess.Read)) { .... } тогда не надо делать fs.Close(), тоесть диспозить ресурс.

  • Anonymous
    March 21, 2008
    Дык я не поспорить, написал же в первом посте, что разницы никакой. А констркция using какраз разворацивается в try-catch с закрытием в finally. Грешным делом думал может ты не знаешь, решил подсказать, потому что мне кажется что если есть в языке такой сахар то почему бы им не пользоваться - красиво же черт возьми :)

  • Anonymous
    March 22, 2008
    Ну не знаю, чем обосновывали, но это удобно, красиво и легко читаемо. Если напишешь сведения от первоисточника будет очень интересно почитать.

  • Anonymous
    March 24, 2008
    The comment has been removed

  • Anonymous
    March 25, 2008
    http://msdn2.microsoft.com/en-us/library/cc189074(vs.95).aspx