代码之家  ›  专栏  ›  技术社区  ›  Gavin

在C中分析XML#

  •  1
  • Gavin  · 技术社区  · 16 年前

    我正在寻找一种读取以下XML的方法

    <Data>
      <MaxCount>10</MaxCount>
      <Points>
        <Point X="10" Y="10"/>
        <Point X="20" Y="10"/>
        <Point X="30" Y="10"/>
        <Point X="40" Y="10"/>
        <Point X="50" Y="10"/>
        <Point X="60" Y="10"/>
      </Points>
    </Data>
    

    基本上,我想将所有的点值读取到一个点对象数组中(我的点对象有两个属性x和y),将maxCount读取到一个整数中。使用C从XML文件中提取点值的最佳方法是什么?

    谢谢

    5 回复  |  直到 16 年前
        1
  •  1
  •   Elisha    16 年前

    可以使用xpath完成:

    public void CreatePoints(string xml)
    {
        XPathDocument doc = new XPathDocument(XmlReader.Create(new StringReader(xml)));
        var xPathNodeIterator = doc.CreateNavigator().Select("/Data/Points/Point");
        foreach (XPathNavigator node in xPathNodeIterator)
        {
            var x = node.SelectSingleNode("@X").ValueAsInt;
            var y = node.SelectSingleNode("@Y").ValueAsInt;
    
            new Point(x, y);
        }
    }
    
        2
  •  8
  •   Arjan Einbu    16 年前

    我建议您看一下XMLSerializer类。它允许您将XML直接序列化和反序列化到对象。

    首先,表示数据的类:

    [XmlRoot(Namespace = "")]
    public class Data
    {
        public int MaxCount;
        public Point[] Points;
    }
    
    public class Point
    {
        [XmlAttribute]
        public int X;
        [XmlAttribute]
        public int Y;
    }
    

    然后使用xmlserializer:

    Stream s = ... // Some code to open you file into a stream
    
    var serializer = new XmlSerializer(typeof(Data));
    Data d = (Data)serializer.Deserialize(s);
    

    文章: http://msdn.microsoft.com/en-us/library/ms950721.aspx

        3
  •  4
  •   Streklin    16 年前

    好吧,您可以使用xmldocument类轻松地读取文件。

    http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

    基本上,您只需要在文件中读取类,然后循环访问它创建的xmlnodes。您将使用节点的innerText属性读取maxCount,当您到达循环遍历其子级并通过xmlnode的attribute属性获取所需的数据时。

        4
  •  4
  •   bruno conde    16 年前
        class Point
        {
            public int X { get; set; }
            public int Y { get; set; }
        }
    
        static int Main(string[] args)
        {
            string xml = "<Data>  <MaxCount>10</MaxCount>  <Points>    <Point X=\"10\" Y=\"10\"/>    <Point X=\"20\" Y=\"10\"/>    <Point X=\"30\" Y=\"10\"/>    <Point X=\"40\" Y=\"10\"/>    <Point X=\"50\" Y=\"10\"/>    <Point X=\"60\" Y=\"10\"/>  </Points></Data>";
    
            XDocument doc = XDocument.Parse(xml);
    
            int maxCount = int.Parse(doc.Element("Data").Element("MaxCount").Value);
    
            var points = from e in doc.Element("Data").Element("Points").Elements("Point")
                         select new Point
                         {
                             X = int.Parse(e.Attribute("X").Value),
                             Y = int.Parse(e.Attribute("Y").Value)
                         };
    
            Console.WriteLine("MaxCount: {0}", maxCount);
            foreach (var item in points)
            {
                Console.WriteLine("Point: {0},{1}", item.X, item.Y);
            }
        }
    
        5
  •  0
  •   rauts    16 年前

    使用maxcount integer属性和一个类型为list的属性点(point是另一个具有x和y属性的类)创建类数据。将这些类标记为可序列化。

    在XmlReader中加载XML。

    使用XmlReader将XML反序列化到数据类中。

    抱歉,没有提供一个有效的例子。

    推荐文章