简体   繁体   中英

Reading an array from an XML file

At the moment iI got this:

class robot
{
    Configuratie config = new Configuratie();
    short[,] AlleCoordinaten = new short[3, 6] 
    {
        {1,2,3,4,5,6},
        {6,5,4,3,2,1},
        {2,3,4,5,6,7}
    };
}

But I want to put that array in a XML-file, so this is what I tried:

class robot
{
private static XDocument xdoc = XDocument.Load("configuratie.xml");

    public Robot()
    {
        short[,] AlleCoordinaten = new short[3, 6];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                AlleCoordinaten[i, j] = GetPositionValue("position" + (i + 1), j);
            }
        }
    }
    public static short GetPositionValue(string position,int index)
   {
       return (short)xdoc.Descendants(position).Skip(index).First();
   }
    private void methode2()
    {
    GoTo[0] = new Position();
    for (short a=0 ; a<10 ; a++)
       {
       GoTo[0].degrees[0] = AlleCoordinaten[a,0];
       GoTo[0].degrees[1] = AlleCoordinaten[a,1];
       GoTo[0].degrees[2] = AlleCoordinaten[a,2];
       GoTo[0].degrees[3] = AlleCoordinaten[a,3];
       GoTo[0].degrees[4] = AlleCoordinaten[a,4];
       GoTo[0].degrees[5] = AlleCoordinaten[a,5];
       //here it tells me The name 'AlleCoordinaten' does not exist in the currect context 
       }
    }
}

configuration file:

    class Configuratie
    {
        private XDocument xdoc;

        public Configuratie()
        {
            xdoc = XDocument.Load("configuratie.xml");
        }
    public int GetIntConfig(string desc1, string desc2)
    {
        int value = 0;
        if (string.IsNullOrEmpty(desc1))
        {
            value = 0;
        }
        if (!string.IsNullOrEmpty(desc1) && !string.IsNullOrEmpty(desc2))
        {
            foreach (XElement node in xdoc.Descendants(desc1).Descendants(desc2))
            {
                value = Convert.ToInt16(node.Value);
            }
        }
        if (!string.IsNullOrEmpty(desc1) && string.IsNullOrEmpty(desc2))
        {  
            foreach (XElement node in xdoc.Descendants(desc1))
            {
                value = Convert.ToInt16(node.Value);
            }
        }
        return value;
        }
    }

XML file:

<robot>
<position1>1</position1>
<position1>2</position1>
<position1>3</position1>
<position1>4</position1>
<position1>5</position1>
<position1>6</position1>
etc...
<position3>7</position3>
</robot>

It still isnt working, could you guys help me with what I did wrong and maybe give an example.

Try this method:

public static short GetPositionValue(string position,int index)
{
    return (short)xdoc.Descendants(position).Skip(index).First();
}

And populate your array with for loop:

Here is the full code:

class robot
{
      private static XDocument xdoc = XDocument.Load("configuratie.xml");

      short[,] AlleCoordinaten = new short[3, 6];
      for (int i = 0; i < 3; i++)
      {
         for (int j = 0; j < 6; j++)
         {
              AlleCoordinaten[i, j] = GetPositionValue("position" + (i+1), j);
         }
      }

      public static short GetPositionValue(string position,int index)
      {
           return (short)xdoc.Descendants(position).Skip(index).First();
      }

}

Note: CHANGE your xdoc definition:

private XDocument xdoc;

To:

private static XDocument xdoc;

Using XmlSerializer would simplify things by a lot:

  • size array automatically;
  • serialization/deserialization is just few rows of code.

Like this

public class Coordinate
{
    public int X1 {get; set;}
    public int Y1 {get; set;}
    public int Z1 {get; set;}
    public int X2 {get; set;}
    public int Y2 {get; set;}
    public int Z2 {get; set;}

    public Coordinate(int x1, int y1, int z1, int x2, int y2, int z2)
    {
        X1 = x1; Y1 = y1; Z1 = z1; X2 = x2; Y2 = y2; Z2 = z2;
    }
}

[XmlArray("Robot")]
public Coordinate[] points = new Coordinate[] {
    new Coordinate(1, 2, 3, 4, 5, 6),
    new Coordinate(6, 5, 4, 3, 2, 1),
    new Coordinate(2, 3, 4 ,5, 6, 7),
}

// serialize (remove long namespace)
var space = new XmlSerializerNamespaces();
space.Add("", "");
var serializer = new XmlSerializer(points.GetType()); // typeof(Coordinate[])
using (var stream = new FileStream("robot.xml", FileMode.Create))
    serializer.Serialize(stream, points, space);

// deserialize
using (var stream = new FileStream("robot.xml", FileMode.Open, FileAccess.Read))
    points = (Coordinate[])serializer.Deserialize(stream);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM