Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C解析XML_C#_.net_Xml - Fatal编程技术网

C# 用C解析XML

C# 用C解析XML,c#,.net,xml,C#,.net,Xml,我正在寻找一种读取以下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"/>

我正在寻找一种读取以下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,最大计数是一个整数。使用C从XML文件中提取点值的最佳方法是什么


谢谢

好的,您可以使用XMLDocument类轻松地读取文件


基本上,您只需要读取文件中的类,然后循环遍历它创建的XMLNodes。您可以使用节点的innerText属性读入MaxCount,当您到达cycle遍历其子级并通过XMLNode的attribute属性获取所需的数据时。

好的,您可以使用XMLDocument类轻松读取文件

    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);
        }
    }

基本上,您只需要读取文件中的类,然后循环遍历它创建的XMLNodes。您可以使用节点的innerText属性读入MaxCount,当您到达cycle遍历其子节点并通过XMLNode的attribute属性获取所需的数据时。

可以使用XPath:

    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);
        }
    }
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);
    }
}

可以使用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);
    }
}

我建议您看看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);

文章:

我建议您看看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);

文章:

创建一个具有MaxCount integer属性的类数据,并且List Point类型的一个属性点是另一个具有X和Y属性的类。将这些类标记为可序列化

在XMLReader中加载Xml

使用Xmlreader将Xml反序列化到数据类中


很抱歉,没有提供一个工作示例。

使用MaxCount integer属性创建一个类数据,并且List Point类型的一个属性点是另一个具有X和Y属性的类。将这些类标记为可序列化

在XMLReader中加载Xml

使用Xmlreader将Xml反序列化到数据类中


很抱歉没有提供一个工作示例。

您可以在1 go with doc.LoadXmlxml中读取XML。在doc variabele上,您可以调用doc.DocumentElement。选择NodesData/Points/*并遍历每个XmlNode。@Patrick:XMLDocument与XPathDocument相比是一个非常重的对象。虽然使用XPathDocument有点麻烦,但它的性能远远优于XMLDocumnet。在doc variabele上,您可以调用doc.DocumentElement。选择NodesData/Points/*并遍历每个XmlNode。@Patrick:XMLDocument与XPathDocument相比是一个非常重的对象。尽管使用XPathDocument有点麻烦,但它的性能远远优于XMLDocumnet。另外,您可以使用xsd.exe自动创建此类@Lee:Great tip。我已经忘记了。已经有一段时间没有使用它了……作为奖励,您可以使用xsd.exe自动为您创建这个类@Lee:Great-tip。我已经忘记了。已经有一段时间没用了…我想这太过分了。在这个简单的场景中使用XPath。@Patrick:Not overkill;-已经有一个他想要填充的point类。关于可读性/复杂性和代码量,请参见上面我的答案……我认为这里有点过分了。在这个简单的场景中使用XPath。@Patrick:Not overkill;-已经有一个他想要填充的point类。有关代码的可读性/复杂性和数量,请参见上面我的答案。。。