读取每个特定节点的所有XML子节点

时间:2012-08-16 19:08:48

标签: c# linq

我需要阅读Child Nodes标记的所有<Imovel>,问题是我的XML文件中有超过1个({1}}个标记,以及它之间的区别每个<Imovel>标记都是一个名为ID的属性。

这是一个例子

<Imovel>

我需要阅读每个<Imoveis> <Imovel id="555"> <DateImovel>2012-01-01 00:00:00.000</DateImovel> <Pictures> <Picture> <Path>hhhhh</Path> </Picture> </Pictures> // Here comes a lot of another tags </Imovel> <Imovel id="777"> <DateImovel>2012-01-01 00:00:00.000</DateImovel> <Pictures> <Picture> <Path>tttt</Path> </Picture> </Pictures> // Here comes a lot of another tags </Imovel> </Imoveis> 标记的所有标记,并且在我在<Imovel>标记中进行的每次验证结束时,我需要进行另一次验证。

所以,我认为我需要做2(2)<Imovel>foreachfor,我对foreach不太了解,但请关注我的样本

LINQ

但效果不好,在我的XmlReader rdr = XmlReader.Create(file); XDocument doc2 = XDocument.Load(rdr); ValidaCampos valida = new ValidaCampos(); //// Here I Count the number of `<Imovel>` tags exist in my XML File for (int i = 1; i <= doc2.Root.Descendants().Where(x => x.Name == "Imovel").Count(); i++) { //// Get the ID attribute that exist in my `<Imovel>` tag id = doc2.Root.Descendants().ElementAt(0).Attribute("id").Value; foreach (var element in doc2.Root.Descendants().Where(x => x.Parent.Attribute("id").Value == id)) { String name = element.Name.LocalName; String value = element.Value; } } 语句中,因为我的foreach标记,其父标记没有ID属性。

有人可以帮我做这个方法吗?

2 个答案:

答案 0 :(得分:8)

你应该能够用两个foreach语句来做到这一点:

foreach(var imovel in doc2.Root.Descendants("Imovel"))
{
  //Do something with the Imovel node
  foreach(var children in imovel.Descendants())
  {
     //Do something with the child nodes of Imovel.
  }
}

答案 1 :(得分:1)

试试这个。 System.Xml.XPath将xpath选择器添加到XElement。使用xpath查找元素更快更简单。

您不需要XmlReader&amp; XDocument加载文件。

XElement root = XElement.Load("test.xml");

foreach (XElement imovel in root.XPathSelectElements("//Imovel"))
{
  foreach (var children in imovel.Descendants())
  {
     String name = children.Name.LocalName;
     String value = children.Value;

     Console.WriteLine("Name:{0}, Value:{1}", name, value);
  }

   //use relative xpath to find a child element
   XElement picturePath = imovel.XPathSelectElement(".//Pictures/Picture/Path");
   Console.WriteLine("Picture Path:{0}", picturePath.Value);
}

请包括

System.Xml.XPath;