none
Lendo XML com tags filhas iguais as tags pais RRS feed

  • Pergunta

  • Bom dia Pessoal, estou com o seguinte problema, possuo um xml com estrutura semelhante a esta: <listamenu>
    <item descricao="Lista Modulos 1" >
    <item maxAbertos = "1" descricao="Teste 1">caminho do executavel</item>
    </item>
    <item descricao="Lista Modulos 2">
    <item maxAbertos = "1" descricao="Teste 1">caminho do executavel</item>
    <item descricao="SubLista">
    <item maxAbertos = "1" descricao="SubTeste 1">caminho do executavel</item>
    </item>
    </item>
    </listamenu>
    Existem tags com o mesmo nome para que fique mais facil para o usuario manipular o arquivo. Este xml será utilizado para criar um menu dinamicamente, e o usuario podera montalo do "jeito que quiser".
    O problema que estou tendo é o seguinte, atraves da classe xmlDocument eu consigo pegar todos as tags "item" atraves do metodo GetElementsByTagName("nomeTag"), porem ele não pega hierarquicamente. Tentei usar o XmlReader, com ele seria perfeito, porem não consegui pegar o valor dos atributos ("maxAbertos, descricao ..."). O getAtributes do XmlReader esta me retornando sempre nulo.
    Alguem conhece alguma solução para que a classe XmlDocument pegue hierarquicamente as tags, ou como pegar os atributos atraves da classe XmlReader, ou ainda alguma outra informação que possa me ajudar?

    Abraço a todos, desde ja agradeço.
    segunda-feira, 28 de novembro de 2011 12:31

Respostas

  • Oi Elias, para identar vc pode clicar no botão Inserir Bloco de codigo, ao lado do HTML na hora em que estiver postando.

    Para o seu problema vc pode usar o xpath, e com as classes xmlNodeList e xmlNode vc pode manipular exatamente quais campos vc quer.

    Segue exemplo de como utilizar essas classes:

     XmlNodeList nlE2EDP01008GRP = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP", nsMgr);
                                    
                XmlNode root = xIdoc.DocumentElement;
    
                foreach (XmlNode noZDORD01000 in nlE2EDP01008GRP)
                {
                    if (noZDORD01000.SelectSingleNode("//ns1:ZDORD01000/ns1:LOEKZ", nsMgr).InnerText == "L" ||
                        noZDORD01000.SelectSingleNode("//ns1:ZDORD01000/ns1:LOEKZ", nsMgr).InnerText == "S")
                    {
                        root.RemoveChild(noZDORD01000);
                    }
                }
    

    Sendo o  xIdoc o seu xmlDocument, e o que esta em vermelho é o xpath, o endereço completo do nó que vc quer pegar.



    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende
    sexta-feira, 2 de dezembro de 2011 12:02

Todas as Respostas

  • me perdoem,primeira vez que estou postando no forum,
    não sei ainda como identar. Mas ja vou descobrir.. :D
    • Editado Elias Eulosio Dalla Corte segunda-feira, 28 de novembro de 2011 12:35 teste para identação, Não estou conseguindo identar
    segunda-feira, 28 de novembro de 2011 12:34
  • Oi Elias, para identar vc pode clicar no botão Inserir Bloco de codigo, ao lado do HTML na hora em que estiver postando.

    Para o seu problema vc pode usar o xpath, e com as classes xmlNodeList e xmlNode vc pode manipular exatamente quais campos vc quer.

    Segue exemplo de como utilizar essas classes:

     XmlNodeList nlE2EDP01008GRP = xIdoc.SelectNodes("//ns0:Receive/ns0:idocData/ns1:E2EDP01008GRP", nsMgr);
                                    
                XmlNode root = xIdoc.DocumentElement;
    
                foreach (XmlNode noZDORD01000 in nlE2EDP01008GRP)
                {
                    if (noZDORD01000.SelectSingleNode("//ns1:ZDORD01000/ns1:LOEKZ", nsMgr).InnerText == "L" ||
                        noZDORD01000.SelectSingleNode("//ns1:ZDORD01000/ns1:LOEKZ", nsMgr).InnerText == "S")
                    {
                        root.RemoveChild(noZDORD01000);
                    }
                }
    

    Sendo o  xIdoc o seu xmlDocument, e o que esta em vermelho é o xpath, o endereço completo do nó que vc quer pegar.



    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende
    sexta-feira, 2 de dezembro de 2011 12:02