C# 用C解析XML
我正在寻找一种读取以下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"/>
<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类。有关代码的可读性/复杂性和数量,请参见上面我的答案。。。