Мне вот больше нравится 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.