• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

drake101

Sorting XML

7 mensagens neste tópico

boas

imaginemos que temos assim um XML

<?xml version='1.0'?>
<Books>
<Book>
  <ID>1</ID>
  <Title>A</Title>
  <Publisher>Lucerne Publishing</Publisher>
</Book>
<Book>
  <ID>2</ID>
  <Title>B</Title>
  <Publisher>Lucerne Publishing</Publisher>
</Book>
<Book>
  <ID>3</ID>
  <Title>C</Title>
  <Publisher>Lucerne Publishing</Publisher>
</Book>
</Books>

e eu para obter os titulos ordenados alfabeticamente faco isto em VB.net

Dim xmldoc As New System.Xml.XPath.XPathDocument("c:\books.xml")
Dim nav As System.Xml.XPath.XPathNavigator = xmldoc.CreateNavigator()

Dim expr As System.Xml.XPath.XPathExpression = nav.Compile("/Books _ /Book/Title")

expr.AddSort(".", System.Xml.XPath.XmlSortOrder.Ascending, _ System.Xml.XPath.XmlCaseOrder.None, "", Xml.XPath.XmlDataType.Text)

Dim iterator As System.Xml.XPath.XPathNodeIterator = nav.Select(expr)

Do While iterator.MoveNext
   System.Diagnostics.Debug.WriteLine(iterator.Current.Value)
Loop

Com este codigo obtem-se os titulos ordenados ate ai tudo bem, mas o que eu queria mesmo era além de ordenar os titulos era conseguir retirar o  valor <ID>

de cada vez que o ciclo era executado do node que estava seleccionado, ou seja, retirar os <ID> dos titulos ordenados.

Thanks in advance.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

simplificando quero obter 2 valores dentro do ciclo while: o Titulo e o ID correspondendo a esse titulo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê lá se assim funciona:

        Dim xmlDoc As New XmlDocument
        Dim xmlPath As String = "c:\books.xml"

        xmlDoc.Load(xmlPath)

        Dim node As XmlNode = xmlDoc.SelectSingleNode("//Books")

        If node IsNot Nothing Then
            For x As Integer = 0 To node.ChildNodes.Count - 1

                With node.ChildNodes.Item(x)
                    Debug.WriteLine("ID: " & .ChildNodes(0).InnerText.ToString)
                    Debug.WriteLine("Title: " & .ChildNodes(1).InnerText.ToString)
                    Debug.WriteLine("Publisher: " & .ChildNodes(2).InnerText.ToString)
                End With

            Next
        End If

Podes sempre ler este artigo que explica um pouco sobre XML

http://vbtuga.blogspot.com/2008/05/vbnet-introduo-ao-xml.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

consegui de uma maneira tao trivial que nem me estava a lembrar dela.

dentro do ciclo bastou meter:

Dim nav2 As XPathNavigator = iterator.Current.Clone()

nav2.MoveToPrevious()

msgbox(nav2.value)

mas la esta, isto e limitado ao title, se quiser ordenar por outro se calhar e melhor tentar o teu metodo :P

edit: estive a olhar melhor para o teu código e reparei que ele nao faz o essencial: ordenar por title ^.^

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

edit: estive a olhar melhor para o teu código e reparei que ele nao faz o essencial: ordenar por title ^.^

Mas não é para utilizares depois ? Se só precisas de o ID e o Title crias uma hastable e fazes depois o Sort()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja ta resolvido :)

Como fizeste ?

Já agora quando está resolvido carrega em "Topic Solved" :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora