парсинг содержимого xml на windows phone 7 с использованием сокетов tcp - PullRequest
0 голосов
/ 02 января 2012

Я работаю над приложением для Windows Phone 7.

У меня есть для анализа потока XML, используя сокеты TCP в C # Silverlight.Я пытаюсь с помощью xmlreader и потока памяти, но это не поможет.Когда поток памяти обновляется с помощью асинхронного вызова приема, xmlreader не влияет на эту программу чтения.

Пожалуйста, помогите мне разобрать потоковый xml из сокетов.

У меня есть xmlReader такой, что:

memoryStream= new MemoryStream();   
_xmlreader = XmlReader.Create(memoryStream, xmlReaderSettings, context);

теперь memoryStream обновляется как:

byte []buffer = "initialized with some xml bytes such as <node1> data </node1>"

, так как этот буфер заполняется операцией Socket receiveasync, которая представляет собой xml.Теперь мне нужно обновить мои данные.поэтому я делаю это ...

memoryStream = memoryStream.write (buffer, 0, buffer.length);

Теперь, когда я делаю это, _reader.read не работает.Я не знаю, почему это происходит.в противном случае есть xmlpullparser (саксофон), как у нас в android os для разбора xml

while (_reader.Read())
            {
                switch (_reader.NodeType)
                {
                    case XmlNodeType.Element:
                        {
                            node = new XElement(_reader.Name);
                            xmlBuildStack.Push(node);

                        }
                        break;

                    case XmlNodeType.EndElement:
                  .....

есть ли другой способ проанализировать xml, исходящий из потока сокетов tcp, когда я работаю над приложением чатакоторый использует XMPP XML разделы.Пожалуйста, помогите мне в решении этого сценария.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

К сожалению, XmlReader практически бесполезен для XMPP. Он буферизует до 4 КБ перед обработкой любого ввода, независимо от того, к какому потоку вы его подключаете.

Даже в качестве первого взлома, чтобы доказать это самому себе, вы не должны писать поток, который увеличивает каждую входящую строфу до 4 КБ, но ТОЛЬКО на границах строфы.

Чтобы обойти проблему, я портировал части парсера Джеймса Кларка XP на C #. Если LGPL работает для вас, вы можете вытащить xpnet из jabber-net (который я не обновил для поддержки WinPhone7) или прислать мне исправления, если у вас работает вся библиотека .

1 голос
/ 02 января 2012

MemoryStream не работает так, как вы хотите. Когда XmlReader читает до текущего конца (т. Е. Использует все текущие данные), он сообщит, что достиг конца файла.

Что вам действительно нужно, так это обернуть поток вокруг сокета TCP. Вероятно, проще всего было бы использовать TcpClient вместо необработанного сокета. Метод GetStream будет делать то, что вы хотите - предоставить поток, из которого вы можете создать XmlReader.

Другой вариант - создать тип потока, который будет выполнять то, что вы просите. То есть он позволяет одному потоку вводить данные, а другой - выводить данные. Но потребитель не сообщает о конце файла, пока производитель не скажет конец файла.

Я написал и опубликовал нечто подобное несколько месяцев назад. См. Создание нового типа потока .

Честно говоря, хотя ... TcpClient будет моим предпочтением в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...