C# 如何解析XML文件以有效地获取特定数据
我有一个XML文件,如下所示:C# 如何解析XML文件以有效地获取特定数据,c#,xml,C#,Xml,我有一个XML文件,如下所示: <?xml version="1.0" encoding="utf-8" ?> <PathMasks> <Mask desc="Masks_X1"> <config id="01" mask="88" /> <config id="03" mask="80" /> <config id="51" mask="85" /> </Mask> <Ma
<?xml version="1.0" encoding="utf-8" ?>
<PathMasks>
<Mask desc="Masks_X1">
<config id="01" mask="88" />
<config id="03" mask="80" />
<config id="51" mask="85" />
</Mask>
<Mask desc="Masks_X2">
<config id="70" mask="1" />
<config id="73" mask="6" />
</Mask>
<Types>
<path id="01" desc="TC->PP1" />
<path id="02" desc="TC->PP2" />
<path id="03" desc="TC->PPn" />
</Types>
</PathMasks>
我使用的.NET框架是2.0使用XDocument并使用Linq to XML查询它
XDocument doc = XDocument.Load("file.xml");
var linqtoxml = from node in document.Descendants("Mask")
where (string)node.Attribute("desc").Value == "Masks_X1"
select node;
foreach (var mask in linqtoxml)
{
// pull data out of here into a structure of your choosing
}
使用Linq到XML:
XDocument doc = XDocument.Load(filename);
var query = from mask in doc.Root.Elements("Mask")
where mask.Attribute("desc").Value == "Masks_X1"
from config in mask.Elements("config")
select new
{
id = config.Attribute("id").Value,
value = config.Attribute("mask").Value
};
foreach(var mask in query)
{
Console.WriteLine("{0}\t{1}", mask.id, mask.value);
}
当您使用.NET2.0时,您将没有Linq,因此需要使用XPath,此示例应该可以帮助您
XmlDocument doc = new XmlDocument();
doc.Load(pathToXmlDoc);
XmlNode node = doc.SelectSingleNode("/PathMasks/Mask[@desc='Masks_X1']");
foreach (XmlNode config in node)
{
Console.WriteLine("{0}\t{1}",
config.Attributes["id"].Value,
config.Attributes["mask"].Value);
}
使用
XmlDocument
(更慢、更大的内存占用、读/写,其工作方式与XMLDOMS的工作方式相同):
使用XPathDocument
(更快、更小的内存占用、只读、怪异的API):
我确信没有一个
XPathNavigator
方法返回一个IEnumerable
,这样你就可以像普通人一样迭代XPath查询的结果了,但是我还没有解决这个问题。我使用的是.NET 2.0,似乎System.Xml名称空间中没有linq。在这种情况下,您几乎只能使用XmlDocument和XPath查询。XPathDocument
早于IEnumerable
。您可以编写自己的扩展方法来实现这一点,然后发布到这里。总有一天,我会记得这些技术是按照它们被引入的顺序引入的,而不是按照我了解到它们存在的顺序引入的。SelectSingleNode
返回单个节点或null。您不能对结果进行迭代。使用SelectSingleNode确实会返回单个XmlNode。但是,每个XmlNode都包含一个子节点的集合,本例中的foreach在选定的单个掩码节点下迭代每个子节点。因此,在本例中,SelectSingleNode将选择具有保存值Mask_X1的desc属性的掩码节点。返回的XmlNode的ChildNodes属性将包含三个条目,分别对应于掩码节点下的每个配置节点。我们可以迭代子节点并生成所需的输出。
XmlDocument doc = new XmlDocument();
doc.Load(pathToXmlDoc);
XmlNode node = doc.SelectSingleNode("/PathMasks/Mask[@desc='Masks_X1']");
foreach (XmlNode config in node)
{
Console.WriteLine("{0}\t{1}",
config.Attributes["id"].Value,
config.Attributes["mask"].Value);
}
XmlDocument d = new XmlDocument();
d.Load(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
foreach (XmlElement elm in d.SelectNodes(xpath))
{
Console.WriteLine(elm.GetAttribute("id"), elm.GetAttribute("desc"));
}
XPathDocument d = new XPathDocument(filename);
string xpath = "/PathMasks/Mask[@desc='Mask_X1']/config"
XPathNodeIterator iter = d.CreateNavigator().Select(xpath);
while (iter.MoveNext())
{
Console.WriteLine(iter.Current.GetAttribute("id"), iter.Current.GetAttribute("desc'));
}