Тормосса при чтении XML в VB Net

Если название форума вам о чём-то говорит, то значит, внутри вы найдете что-то для себя полезное.
Metallikus
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 18.01.2009 (Вс) 1:32

Тормосса при чтении XML в VB Net

Сообщение Metallikus » 19.02.2009 (Чт) 1:14

В общем надо мне считать из xml, причем все возможные ноды у меня перебираются во вложенном цикле (а в цикле вложен try-catch). Тормозит жутко, если файл не содержит всех нодов из возможных...
Вот код:
Код: Выделить всё
        Dim reader As XmlDocument = New XmlDocument()
        reader.Load(OpenFileDialog.FileName)
        Dim i, y As Integer
        For y = 0 To 16
            For i = 0 To 13
                Try ' вот если не через try всё сделать, а через if и какой-нибудь спец. метод, то наверно всё заработает...
                    Lifes(i, y) = reader.DocumentElement("Node" & i & "x" & y).Attributes.ItemOf("Attr1").Value()
                    Bonuses(i, y) = reader.DocumentElement("Node" & i & "x" & y).Attributes.ItemOf("Attr2").Value()
                Catch ex As NullReferenceException
                    Attr1(i, y) = 0
                    Attr2(i, y) = 0
                End Try
            Next
        Next
    End Sub

А вот если есть все возможные ноды, то работает всё быстро. Почему? Как бы мне это оптимизировать бы... Да только не очень я ещё в XML в разбираюсь... Плз хлп.
Много здесь таких как я, кто в инете через GPRS?

Metallikus
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 18.01.2009 (Вс) 1:32

Re: Тормосса при чтении XML в VB Net

Сообщение Metallikus » 20.02.2009 (Пт) 1:43

В общем, все тормоза заключаются в обработке исключений, и если обойтись без неё, то, наверно, производительность повысится в разы...
Никто не скажет, есть ли в System.Xml.XmlDocument какой-нибудь метод/событие/свойство, чтобы проверить наличие определённого нода в документе? Или чем мне лучше такой вот файл читать:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<root>
  <Kir2x0 life="4" Bonus="0" X="122" Y="0" />
  <Kir3x0 life="4" Bonus="0" X="183" Y="0" />
  <Kir4x0 life="4" Bonus="0" X="244" Y="0" />
  <Kir5x0 life="4" Bonus="0" X="305" Y="0" />
  <Kir6x0 life="4" Bonus="0" X="366" Y="0" />
  <Kir7x0 life="4" Bonus="0" X="427" Y="0" />
  <Kir11x0 life="4" Bonus="0" X="671" Y="0" />
  <Kir12x0 life="4" Bonus="0" X="732" Y="0" />
  <Kir13x0 life="4" Bonus="0" X="793" Y="0" />
  <Kir1x1 life="4" Bonus="0" X="61" Y="30" />
  <Kir2x1 life="4" Bonus="0" X="122" Y="30" />
  <Kir7x1 life="4" Bonus="0" X="427" Y="30" />
  <Kir8x1 life="4" Bonus="0" X="488" Y="30" />
  <Kir10x1 life="4" Bonus="0" X="610" Y="30" />
  <Kir11x1 life="4" Bonus="0" X="671" Y="30" />
  <Kir1x2 life="4" Bonus="0" X="61" Y="60" />
  <Kir8x2 life="4" Bonus="0" X="488" Y="60" />
  <Kir10x2 life="4" Bonus="0" X="610" Y="60" />
  <Kir0x3 life="4" Bonus="0" X="0" Y="90" />
  <Kir1x3 life="4" Bonus="0" X="61" Y="90" />
  <Kir3x3 life="4" Bonus="0" X="183" Y="90" />
  <Kir8x3 life="4" Bonus="0" X="488" Y="90" />
  <Kir10x3 life="4" Bonus="0" X="610" Y="90" />
  <Kir0x4 life="4" Bonus="0" X="0" Y="120" />
  <Kir2x4 life="4" Bonus="0" X="122" Y="120" />
  <Kir3x4 life="4" Bonus="0" X="183" Y="120" />
  <Kir4x4 life="4" Bonus="0" X="244" Y="120" />
  <Kir8x4 life="4" Bonus="0" X="488" Y="120" />
  <Kir10x4 life="4" Bonus="0" X="610" Y="120" />
  <Kir2x5 life="4" Bonus="0" X="122" Y="150" />
  <Kir4x5 life="4" Bonus="0" X="244" Y="150" />
  <Kir5x5 life="4" Bonus="0" X="305" Y="150" />
  <Kir8x5 life="4" Bonus="0" X="488" Y="150" />
  <Kir10x5 life="4" Bonus="0" X="610" Y="150" />
  <Kir2x6 life="4" Bonus="0" X="122" Y="180" />
  <Kir5x6 life="4" Bonus="0" X="305" Y="180" />
  <Kir8x6 life="4" Bonus="0" X="488" Y="180" />
  <Kir10x6 life="4" Bonus="0" X="610" Y="180" />
  <Kir2x7 life="4" Bonus="0" X="122" Y="210" />
  <Kir5x7 life="4" Bonus="0" X="305" Y="210" />
  <Kir6x7 life="4" Bonus="0" X="366" Y="210" />
  <Kir8x7 life="4" Bonus="0" X="488" Y="210" />
  <Kir10x7 life="4" Bonus="0" X="610" Y="210" />
  <Kir11x7 life="4" Bonus="0" X="671" Y="210" />
  <Kir2x8 life="4" Bonus="0" X="122" Y="240" />
  <Kir5x8 life="4" Bonus="0" X="305" Y="240" />
  <Kir6x8 life="4" Bonus="0" X="366" Y="240" />
  <Kir7x8 life="4" Bonus="0" X="427" Y="240" />
  <Kir8x8 life="4" Bonus="0" X="488" Y="240" />
  <Kir11x8 life="4" Bonus="0" X="671" Y="240" />
  <Kir2x9 life="4" Bonus="0" X="122" Y="270" />
  <Kir3x9 life="4" Bonus="0" X="183" Y="270" />
  <Kir5x9 life="4" Bonus="0" X="305" Y="270" />
  <Kir7x9 life="4" Bonus="0" X="427" Y="270" />
  <Kir8x9 life="4" Bonus="0" X="488" Y="270" />
  <Kir11x9 life="4" Bonus="0" X="671" Y="270" />
  <Kir3x10 life="4" Bonus="0" X="183" Y="300" />
  <Kir5x10 life="4" Bonus="0" X="305" Y="300" />
  <Kir8x10 life="4" Bonus="0" X="488" Y="300" />
  <Kir11x10 life="4" Bonus="0" X="671" Y="300" />
  <Kir3x11 life="4" Bonus="0" X="183" Y="330" />
  <Kir5x11 life="4" Bonus="0" X="305" Y="330" />
  <Kir8x11 life="4" Bonus="0" X="488" Y="330" />
  <Kir9x11 life="4" Bonus="0" X="549" Y="330" />
  <Kir11x11 life="4" Bonus="0" X="671" Y="330" />
  <Kir3x12 life="4" Bonus="0" X="183" Y="360" />
  <Kir5x12 life="4" Bonus="0" X="305" Y="360" />
  <Kir9x12 life="4" Bonus="0" X="549" Y="360" />
  <Kir10x12 life="4" Bonus="0" X="610" Y="360" />
  <Kir11x12 life="4" Bonus="0" X="671" Y="360" />
  <Kir3x13 life="4" Bonus="0" X="183" Y="390" />
  <Kir5x13 life="4" Bonus="0" X="305" Y="390" />
  <Kir10x13 life="4" Bonus="0" X="610" Y="390" />
  <Kir12x13 life="4" Bonus="0" X="732" Y="390" />
  <Kir3x14 life="4" Bonus="0" X="183" Y="420" />
  <Kir5x14 life="4" Bonus="0" X="305" Y="420" />
  <Kir12x14 life="4" Bonus="0" X="732" Y="420" />
  <Kir2x15 life="4" Bonus="0" X="122" Y="450" />
  <Kir3x15 life="4" Bonus="0" X="183" Y="450" />
  <Kir5x15 life="4" Bonus="0" X="305" Y="450" />
  <Kir6x15 life="4" Bonus="0" X="366" Y="450" />
  <Kir11x15 life="4" Bonus="0" X="671" Y="450" />
  <Kir12x15 life="4" Bonus="0" X="732" Y="450" />
  <Kir1x16 life="4" Bonus="0" X="61" Y="480" />
  <Kir2x16 life="4" Bonus="0" X="122" Y="480" />
  <Kir6x16 life="4" Bonus="0" X="366" Y="480" />
  <Kir7x16 life="4" Bonus="0" X="427" Y="480" />
  <Kir8x16 life="4" Bonus="0" X="488" Y="480" />
  <Kir9x16 life="4" Bonus="0" X="549" Y="480" />
  <Kir10x16 life="4" Bonus="0" X="610" Y="480" />
  <Kir11x16 life="4" Bonus="0" X="671" Y="480" />
</root>
?
Много здесь таких как я, кто в инете через GPRS?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Тормосса при чтении XML в VB Net

Сообщение iGrok » 20.02.2009 (Пт) 2:26

Metallikus писал(а):
Код: Выделить всё
  <Kir10x16 life="4" Bonus="0" X="610" Y="480" />
  <Kir11x16 life="4" Bonus="0" X="671" Y="480" />


Я правильно понимаю, что ты его и создаёшь?
А если так и есть, что тебе мешает сделать так:
Код: Выделить всё
  <Kir pos="10x16" life="4" Bonus="0" X="610" Y="480" />
  <Kir pos="11x16" life="4" Bonus="0" X="671" Y="480" />
label:
cli
jmp label

Metallikus
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 18.01.2009 (Вс) 1:32

Re: Тормосса при чтении XML в VB Net

Сообщение Metallikus » 20.02.2009 (Пт) 3:19

Ага, создаю. А разве ноды с одинаковыми именами допустимы? Я думал, надо чтоб нодов одинаковых не было, а поскольку файл пишется во вложенном цикле, я имена нодов и решил такими сделать (10x16 - это по сути порядковый номер нода , и не более того, использовать это где-либо кроме как при чтении файла не собираюсь).
Много здесь таких как я, кто в инете через GPRS?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Тормосса при чтении XML в VB Net

Сообщение iGrok » 20.02.2009 (Пт) 13:12

Вполне себе допустимы..
label:
cli
jmp label

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Тормосса при чтении XML в VB Net

Сообщение RayShade » 20.02.2009 (Пт) 13:26

Мне вот больше нравится Saxon - во первых, потому что он быстрее, а во вторых - потому что он понимает XSL 1.1, 2.0 и разные еще расширения типа exslt.
В System.Xml.XmlDocument есть такой метод как SelectSingleNode(XPath) - если он вернет nothing, значит запрашиваемого нода в контексте нет.

Пример:
Код: Выделить всё
dim node as xml.xmlnode=mydocument.selectsinglenode("/descendant::*[name()='myname']")

Код: Выделить всё
dim node as xml.xmlnode=mydocument.selectsinglenode("/descendant::myname")

Код: Выделить всё
dim node as xml.xmlnode=mydocument.selectsinglenode("//myname")


Все три примера проверяют наличия myname во всем документе, на любому уровне иерархии.

Ну и да, сделаем по-человечески то, что приведено в заголовке топика:
Код: Выделить всё
Dim reader As XmlDocument = New XmlDocument()
reader.Load(OpenFileDialog.FileName)
Dim i, y As Integer
Dim node as XmlNode
For y = 0 To 16
For i = 0 To 13
node = reader.selectsinglenode("//kir"+y.tostring()+"x"+i.tostring())
if node isnot nothing then
Lifes(i, y) = node.attributes.getnameditem("Attr1").value
Bonuses(i, y) = node.attributes.getnameditem("Attr2").value
else:
Lifes(i, y) = 0
Bonuses(i, y) = 0
end if
End Try
Next
Next
End Sub


Да, от себя замечу, что если бы использовался парсер 2.0, то все нужные ноды можно было бы сразу получить в коллекцию, и потом быстро по ней пробежаться (код нерабочий, он просто дает предствление о том что надо делать):

Код: Выделить всё
for each node as xmlnode in document.selectnodes("//*[matches(name(),'Kir[0-1]?[0-6]x[0-1]?[0-3]')]")
next


Ну и еще замечу, что хранить данные в XML удобнее чем в массиве - так что перенос сам по себе по моему бессмысленен.

UPD: Я точно не помню, но кажется xpathnodeiterator понимает xpath 2.0 - в этом случае можно не использовать saxon, а обойтись родными классами, и применить мое мега выражение :)
I don't understand. Sorry.

Metallikus
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 18.01.2009 (Вс) 1:32

Re: Тормосса при чтении XML в VB Net

Сообщение Metallikus » 21.02.2009 (Сб) 0:41

2 Ray-Shader
Спасибо, узнал много нового, хотя понял не все слова :). Но использовать буду System.Xml.XmlTextReader, так как он вроде быстрее, код переписал вот так:
1)Обнуляю все значения всех элементов массива
2) :
Код: Выделить всё
        Dim xmlreader As New Xml.XmlTextReader(OpenFileDialog.FileName)
        Dim i, y, tmplife, tmpbonus as Integer
        xmlreader.Read()
        xmlreader.Read()
        Do While xmlreader.Read()
            If xmlreader.Name.Remove(3) = "Kir" Then
                xmlreader.MoveToNextAttribute()
                tmplife = xmlreader.Value()
                xmlreader.MoveToNextAttribute()
                tmpbonus = xmlreader.Value()
                i = xmlreader.Value() / 61
                xmlreader.MoveToNextAttribute()
                y = xmlreader.Value() / 30
                Lifes(i, y) = tmplife
                Bonuses(i, y) = tmpbonus
            End If
            xmlreader.Read()
            xmlreader.MoveToNextAttribute()
            i = -1
            y = -1
        Loop

И чёта мне так кажется, что кривовато получилось (слишком уж много в дотнете всяких разных классов для xml, так что разобраться не сразу получается что зачем нужно...)... Но то, что мне нужен именно Xml.XmlTextReader я понял сразу, как только узнал что он делает
Много здесь таких как я, кто в инете через GPRS?

Metallikus
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 18.01.2009 (Вс) 1:32

Re: Тормосса при чтении XML в VB Net

Сообщение Metallikus » 23.02.2009 (Пн) 0:49

А вот ещё такой вопрос, как мне Xml.XmlWriter заставить сохранять отформатированный текст? А то щас он у меня всё в одну строку пишет))) Рылся-рылся в msdn, но путного не нарыл ничего...
Много здесь таких как я, кто в инете через GPRS?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Тормосса при чтении XML в VB Net

Сообщение RayShade » 24.02.2009 (Вт) 11:10

Пользоваться надо классом XmlDocument - он гораздо удобнее: дает доступ к DOM модели, умеет сохранять "красиво", с отступами, к нему можно прикрутить валидатор и проверять документ на соответствие схеме, к нему можно прикрутить xpathnodeiterator, и делать быстрый поиск нодов и атрибутов. А все остальные способы - в топку :)
I don't understand. Sorry.


Вернуться в XML/XSL/XHTML

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList