[英]C# read XML File and select Nodes
i try to read from an XML file. 我尝试从XML文件读取。 the XML file is created whith the c# XmlSerializer.
XML文件是使用C#XmlSerializer创建的。
the xml file Looks like xml文件看起来像
<command>
<Name>one</Name>
<data>
<int>46</int>
<int>49</int>
<int>50</int>
</data>
<rangeData>
<int>36</int>
<int>29</int>
<int>10</int>
</rangeData>
</command>
to read the xml file i use the following code 读取xml文件,我使用以下代码
string filename = "01.xml";
XmlDocument xdc = new xmlDocument();
xdc.Load(filename);
XmlNodeList xnlNodes = xelRoot.SelectNodes("command");
foreach(XMLNode nxmNode in xnlNodes)
{
XmlElement element = (XmlElement)xndNode;
string Name = Convert.ToString(xndNode{"Name"].InnerText);
data = new int[]
{
Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText),
Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText),
Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText),
};
rangeData = new int[]
{
Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText),
Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText),
Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText),
};
}
}
my Problem is, that i do not know how to select the right child node. 我的问题是,我不知道如何选择正确的子节点。 i hope that someone can help me please.
我希望有人可以帮助我。 thanks
谢谢
Here's how to do it with your approach: 使用您的方法的方法如下:
string filename = "01.xml";
XmlDocument xdc = new XmlDocument();
xdc.Load(filename);
XmlNodeList xnlNodes = xdc.SelectNodes("command");
foreach (XmlNode xnlNode in xnlNodes)
{
XmlElement element = (XmlElement)xnlNode;
string Name = Convert.ToString(xnlNode["Name"].InnerText);
int[] data = new int[]
{
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[0].InnerText),
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[1].InnerText),
Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[2].InnerText)
};
int[] rangeData = new int[]
{
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[0].InnerText),
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[1].InnerText),
Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[2].InnerText)
};
}
I suggest to use LINQ for reading XML: 我建议使用LINQ读取XML:
var xdoc = XDocument.Load(filename);
var cmd = xdoc.Root;
var command = new {
Name = (string)cmd.Element("Name"),
Data = cmd.Element("data").Elements().Select(e => (int)e).ToList(),
RangeData = cmd.Element("rangeData").Elements().Select(e => (int)e).ToList()
};
Output: 输出:
{
Name: "one",
Data: [ 46, 49, 50 ],
RangeData: [ 36, 29, 10 ]
}
if you didn't provide whole xml, but only part of it and actually you have many commands, then parsing will look like 如果您没有提供完整的xml,而只是提供了一部分,并且实际上您有很多命令,那么解析将看起来像
var commands =
from cmd in xdoc.Descendands("command")
select new {
Name = (string)cmd.Element("Name"),
Data = cmd.Element("data").Elements().Select(e => (int)e).ToList(),
RangeData = cmd.Element("rangeData").Elements().Select(e => (int)e).ToList()
}
Here's an example how to access nodes using xpath 这是一个如何使用xpath访问节点的示例
XmlDocument xdc = new XmlDocument();
xdc.Load(filename);
var nodes = xdc.SelectNodes("command/data/int");
foreach (XmlNode node in nodes)
{
string s = node.InnerText;
}
To learn more about XPath, check this tutorial 要了解有关XPath的更多信息,请查看本教程
you can use XPath here 您可以在这里使用XPath
void Main()
{
var doc = new XmlDocument();
doc.LoadXml(xml);
var name = doc.DocumentElement
.SelectSingleNode("/command/Name")
.InnerText;
var data = doc.DocumentElement
.SelectNodes("/command/data/int")
.OfType<XmlNode>()
.Select(x=> Int32.Parse(x.InnerText))
.ToArray();
var rangeData = doc.DocumentElement
.SelectNodes("/command/rangeData/int")
.OfType<XmlNode>()
.Select(x => Int32.Parse(x.InnerText))
.ToArray();
}
string xml = @"
<command>
<Name>one</Name>
<data>
<int>46</int>
<int>49</int>
<int>50</int>
</data>
<rangeData>
<int>36</int>
<int>29</int>
<int>10</int>
</rangeData>
</command>
";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.