Чтение 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 removedAnonymous
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.htmlAnonymous
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 removedAnonymous
March 25, 2008
http://msdn2.microsoft.com/en-us/library/cc189074(vs.95).aspx