2011-01-06 79 views
0

我读在c#逻辑关闭读取XML文件

xml文件它tkaes的

<root> 
<data> 
    <file> 
    <a> 
    <b> 
    <c> 
</data> 
<data> 
    <file> 
    <a> 
    <b> 
    <c> 
</data> 
</root> 

等的结构。我阅读通过获得节点列表

XmlNodeList listOfObjects = doc.SelectNodes("path")这给我一个我可以为每个节点的列表。因此,每个节点代表<data>标记的一个实例,它具有子节点。我不能想到如何我可以foreach子节点并将其添加到arraylist。

如果我有List<Data> mylist = new List<Data>()里边有我想要一个文件字符串,字符串B,串c如何在XML foreach循环,我可以说

Data d = new Data(node.innertext, node.innertext.....) 
mylist.add(d); 

之前有人说我需要显示的代码,我不能作为其敏感的工作数据,我试图做一个体面的例子,显示寿

感谢

+2

如果可以,我会建议切换到LINQ换XML。在c#中使用xml是一个更好的模型,并且您也可以从Linq中获益。 – juharr 2011-01-06 18:19:24

回答

0
public class Data 
{ 
    string tagName; 
    string value; 
    public Data(string tagName, string value) 
    { 
     this.tagName = tagName; 
     this.value = value; 
    } 

    public static List<Data> Parse(XmlNodeList nodes) 
    { 
     List<Data> listData = new List<Data>(); 
     foreach (XmlNode node in nodes) 
     { 
      foreach (XmlNode childNode in node.ChildNodes) 
      { 
       Data data = new Data(childNode.Name, childNode.InnerText); 
       listData.Add(data); 
      } 
     } 
     return listData; 
    } 
} 

然后通过你的节点列表作为

List<Data> mylist = new List<Data>() 
myList.AddRange(Data.Parse(yourNodelist)); 
0

问题:如果你目前它的结构刚性,不要过度的子节点的foreach,但选择子节点的名称和提取数据。如果你喜欢,你可以用xpath来做到这一点,但如果你可以选择,我会去找linq-to-xml。它很好地支持了这种情况。我几乎放弃了xml,直到我发现了linq to xml。

0

你可以使用LINQ到XML

XDocument algo = XDocument.Load("somefile"); 
List<Data> somelist = algo.Descendants("data").Elements().Select(x=> new Data(x)).ToList(); 

和数据是一个个性化的类,您可以创建以管理该内容节点。

class Data 
{ 
    //possible properties to be set with "x" 
    public Data(XElement x) 
    { 
     //Do something with x 
    } 
} 
1

的LINQ to XML示例(LINQPad运行 - 集语言C#程序):

void Main() 
{ 
    var doc = XElement.Parse(
     @"<root> 
     <data> 
      <file>file1</file> 
      <a>nodea</a> 
      <b>nodeb</b> 
      <c>nodec</c> 
     </data> 
     <data> 
      <file>file2</file> 
      <a>node2a</a> 
      <b>node2b</b> 
      <c>node2c</c> 
     </data> 
     </root>"); 
    // Or use XElement.Load to load from file, stream, URI, etc. 

    List<Data> mylist = 
     doc.Elements() 
      .Select(
       x => 
       new Data 
       { 
        File = x.Element("file").Value, 
        A = x.Element("a").Value, 
        B = x.Element("b").Value, 
        C = x.Element("c").Value}) // or call constructor 
      .ToList(); 

    mylist.Dump(); // LINQPad extension to display output 
} 

public class Data 
{ 
    public string File { get; set; } 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 
}