none
Percorrer XML C# utilizando recursividade RRS feed

  • Pergunta

  • Pessoal,

    Seguinte, Esse XML (uma partE) abaixo, tem vários nós pais chamados: ScheduleType. Dentro desses nós, a outros nós filhos como o "Dealer" que também tem dois nós filhos "Code" e "Nome". Não estou conseguindo pegar os valores desse nó "Dealer". Acredito que a única forma de "pegar" seja usando recursividade. Alguém poderia me ajudar no assunto ?

    XML

    <ArrayOfScheduleType>
    	<ScheduleType>
        <Processing xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">2015-03-26T07:10:52.527</Processing>
        <SchedulingCategory xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">Regular</SchedulingCategory>
        <AssistanceSchedule xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">2015-03-25T07:40:00</AssistanceSchedule>
        <Dealer xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">
          <Code>5168</Code>
          <Name>BRACOM VEICULOS E PECAS S/A</Name>
        </Dealer>
        <Advisor xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">
          <Code>100321</Code>
          <Name>Elcilane</Name>
          <NationalID>092111111</NationalID>
        </Advisor>
        <Status xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">Completed</Status>
        <Vehicle xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">
          <LicensePlate>11111</LicensePlate>
          <ModelCode>11111</ModelCode>
          <ModelDescription>I/FORD RANGER XLSCD4 2</ModelDescription>
          <VIN>111111</VIN>
        </Vehicle>
        <Customer xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">
          <NationalID>111111111111</NationalID>
          <FirstName>WILLIAM</FirstName>
          <LastName>WALTER11111111</LastName>
          <Email>WWPRETYMAN@1111111</Email>
          <Phone>
            <AreaCode>22</AreaCode>
            <PhoneNumber>11111111111111</PhoneNumber>
            <PhoneCategory>Home</PhoneCategory>
          </Phone>
          <Phone>
            <AreaCode>0</AreaCode>
            <PhoneNumber>0</PhoneNumber>
            <PhoneCategory>Comercial</PhoneCategory>
          </Phone>
          <Phone>
            <AreaCode>0</AreaCode>
            <PhoneNumber>0</PhoneNumber>
            <PhoneCategory>Mobile</PhoneCategory>
          </Phone>
          <Address>
            <Address>AV PRESIDENTE VARGAS</Address>
            <Number>SN</Number>
            <Complement />
            <District>11111111111</District>
            <City>111111111</City>
            <State>RJ</State>
          </Address>
        </Customer>
        <Service xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">
          <Code>27</Code>
          <Description>Mecânica</Description>
        </Service>
        <Passante xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">false</Passante>
        <ServiceReturn xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">false</ServiceReturn>
        <ReScheduling xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">false</ReScheduling>
        <CustomerCheckin xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">2015-03-25T07:40:00</CustomerCheckin>
        <CustomerCheckout xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">2015-03-25T16:00:00</CustomerCheckout>
        <SchedulingUser xmlns="urn:ford/Consumer/ServiceSchedule/v1.0">P-BASTO2</SchedulingUser>
      </ScheduleType>
    </ArrayOfScheduleType>

    Código que usei para tentar "pegar" o Dealer. Porém, sem sucesso.

                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"E:\XML\ResponseRequestSchedule.xml");
               
                XmlNodeList xSTList = xmlDoc.SelectNodes("/ArrayOfScheduleType/ScheduleType");
                foreach (XmlNode xST in xSTList)
                {
    
                    ServiceScheduleType ss = new ServiceScheduleType();
    
                    ss.SchedulingCategory = xST["SchedulingCategory"].InnerText;
                    ss.AssistanceSchedule = xST["AssistanceSchedule"].InnerText;
    
    
                    XmlNodeList xDList = xmlDoc.SelectNodes("/ScheduleType/Dealer");
                    foreach (XmlNode xD in xDList)
                    {
                        Dealer d = new Dealer();
    
                        d.DealerCode = xD["Code"].InnerText;
                        d.DealerName = xD["Name"].InnerText;
                    }
                }

    segunda-feira, 30 de março de 2015 18:11

Respostas

  • Segue um exemplo de método recursivo:

            private string xmlTeste = "<pai><filho1><name>Filho 1</name><filho11><name>Filho 1.1</name><filho111><name>Filho 1.1.1</name></filho111></filho11></filho1><filho2><name>Filho 2</name><filho21><name>Filho 2.1</name><filho211><name>Filho 2.1.1</name></filho211></filho21></filho2></pai>";
    
            private List<string> values = new List<string>();
    
            private void MetodoRecursivo(XmlNode xNode)
            {
                foreach (XmlNode xNodeFilho in xNode.ChildNodes)
                {
                    if (xNodeFilho.Name.Equals("name"))
                        values.Add(xNode.FirstChild.InnerText);
                    MetodoRecursivo(xNodeFilho);
                }
            }
    
            private void CarregarXml()
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.LoadXml(xmlTeste);
                foreach (XmlNode xNode in xDoc.ChildNodes)
                {
                    MetodoRecursivo(xNode);
                }
            }

    segunda-feira, 30 de março de 2015 18:37
  • Opa e aí Yannick, beleza?

    Eu consegui fazer sem utilizar recursividade, através da classe XmlReader. Segue exemplo:

    Espero que ajude.

        class Program
        {
            public class Dealer
            {
    
                public int code;
                public string name;
    
            }
    
            static void Main(string[] args)
            {
                XmlReader reader = XmlReader.Create("teste.xml");
    
                Dealer d = new Dealer();
    
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Code")
                    {
                        d.code = reader.ReadElementContentAsInt();
                    }
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name")
                    {
                        d.name = reader.ReadElementContentAsString();
                    }
                }
                Console.WriteLine("{0} - {1}",d.code,d.name);
                Console.ReadKey();
    
            }
    
            //imprime "5168 - BRACOM VEICULOS E PECAS S/A



    segunda-feira, 30 de março de 2015 19:01

Todas as Respostas

  • Segue um exemplo de método recursivo:

            private string xmlTeste = "<pai><filho1><name>Filho 1</name><filho11><name>Filho 1.1</name><filho111><name>Filho 1.1.1</name></filho111></filho11></filho1><filho2><name>Filho 2</name><filho21><name>Filho 2.1</name><filho211><name>Filho 2.1.1</name></filho211></filho21></filho2></pai>";
    
            private List<string> values = new List<string>();
    
            private void MetodoRecursivo(XmlNode xNode)
            {
                foreach (XmlNode xNodeFilho in xNode.ChildNodes)
                {
                    if (xNodeFilho.Name.Equals("name"))
                        values.Add(xNode.FirstChild.InnerText);
                    MetodoRecursivo(xNodeFilho);
                }
            }
    
            private void CarregarXml()
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.LoadXml(xmlTeste);
                foreach (XmlNode xNode in xDoc.ChildNodes)
                {
                    MetodoRecursivo(xNode);
                }
            }

    segunda-feira, 30 de março de 2015 18:37
  • Opa e aí Yannick, beleza?

    Eu consegui fazer sem utilizar recursividade, através da classe XmlReader. Segue exemplo:

    Espero que ajude.

        class Program
        {
            public class Dealer
            {
    
                public int code;
                public string name;
    
            }
    
            static void Main(string[] args)
            {
                XmlReader reader = XmlReader.Create("teste.xml");
    
                Dealer d = new Dealer();
    
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Code")
                    {
                        d.code = reader.ReadElementContentAsInt();
                    }
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name")
                    {
                        d.name = reader.ReadElementContentAsString();
                    }
                }
                Console.WriteLine("{0} - {1}",d.code,d.name);
                Console.ReadKey();
    
            }
    
            //imprime "5168 - BRACOM VEICULOS E PECAS S/A



    segunda-feira, 30 de março de 2015 19:01