Usuário com melhor resposta
Lendo XML com tags filhas iguais as tags pais

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.- Editado Elias Eulosio Dalla Corte segunda-feira, 28 de novembro de 2011 12:37 correção da identação
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- Sugerido como Resposta Levi DomingosModerator domingo, 4 de dezembro de 2011 18:18
- Marcado como Resposta Levi DomingosModerator quinta-feira, 8 de dezembro de 2011 20:55
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
-
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- Sugerido como Resposta Levi DomingosModerator domingo, 4 de dezembro de 2011 18:18
- Marcado como Resposta Levi DomingosModerator quinta-feira, 8 de dezembro de 2011 20:55