【问题标题】:How read the element value inside a node in a XML file using C#如何使用 C# 读取 XML 文件中节点内的元素值
【发布时间】:2016-05-29 09:18:34
【问题描述】:

早上好, 我有一个以这种方式编写为 XML 文件的模板文件

<Simulation>
<Pedestrian Name="Mother">
    <Initial_Position In_X="3" In_Y="3" />
    <Final_Position>
        <First Fin_X="6" Fin_Y="6" Time="2" />
    </Final_Position>
</Pedestrian>

我实现了一个类来读取文件。

while (reader.Read() || i<Number_of_pedestrian)
{
    if (reader.Name == "Pedestrian")
    {
        if (reader.HasAttributes == true)
        {
            name = reader.GetAttribute("Name");
            //MessageBox.Show(name);                            
        }
    }

    if(reader.Name == "Initial_Position")
    {
        if (reader.GetAttribute("In_X") != null && reader.GetAttribute("In_Y") != null)
        {
            X1 = int.Parse(reader.GetAttribute("In_X"));
            Y1 = int.Parse(reader.GetAttribute("In_Y"));
        }
    }

    if (reader.Name == "Initial_Position")
    {
        if (reader.GetAttribute("Fin_X") != null && reader.GetAttribute("Fin_Y") != null)
        {
            X2 = int.Parse(reader.GetAttribute("Fin_X"));
            Y2 = int.Parse(reader.GetAttribute("Fin_Y"));
        }
    }
    //Position Initial_Position = new Position (X1,Y1);
    //Position Final_Position = new Position(X2, Y2);

    Pd[i]=new Pedestrian (name, X1, Y1, X2, Y2);
    Pd[i].Draw();
    i++;
}

能够读取任何属性(在本例中为“Name”)但无法在节点内部读取然后获取属性(在本例中为“Initial_Position”,然后是“In_X”)。

此外,Pd[i]=new Pedestrian (name, X1, Y1, X2, Y2); 行给我以下错误:

System.IndexOutOfRangeException occurs. 
Additional Information : index over limits of matrix

【问题讨论】:

  • Pedestrian 类是什么?
  • 我建议您尝试某种 XML 反序列化或 LINQ to XML。基于XmlDocument 的解决方案往往更难使用。
  • 代码中缺少一些信息。 Pedestrianclass 是什么,reader 是什么类型(我假设是 XmlReader),Pd 数组在哪里定义。另外,System.IndexOutOfRangeException 可能是由于数组没有足够的空间造成的。

标签: c# xml visual-studio


【解决方案1】:

确保提供所需的 XML。确保您的 XML 的每个标签都有一个结束标签, 确保&lt;Pedestrian Name="Mother"&gt; 有一个结束标签。 然后在执行前检查 X 和 Y

Pd[i]=new Pedestrian (name, X1, Y1, X2, Y2);
Pd[i].Draw();

看看Loading XML String into datatable

【讨论】:

    【解决方案2】:

    您为什么不在 LINQ to XML 中执行此操作。简单多了,代码也干净了很多:

    using System.Xml.Linq;
    
    string xml = "<Simulation><Pedestrian Name='Mother'><Initial_Position In_X='3' In_Y='3' /><Final_Position><First Fin_X='6' Fin_Y='6' Time='2' /></Final_Position></Pedestrian></Simulation>";
    XDocument doc = XDocument.Parse(xml);
    
    foreach (XElement pedestrian in doc.Root.Elements("Pedestrian"))
    {
        XElement initialPosition = pedestrian.Element("Initial_Position");
    
        string name = pedestrian.Attribute("Name").Value;
        string x = initialPosition.Attribute("In_X").Value;
        string y = initialPosition.Attribute("In_Y").Value;
    
        Console.WriteLine("Name - {0}.X - {1}.Y - {2}", name, x, y);
    
    }
    
    Console.ReadKey();
    

    【讨论】:

      【解决方案3】:

      您可以使用XDocument 来执行此操作。

          XDocument doc = XDocument.Parse(input);
      
      
          var results = doc.Descendants("Pedestrian")
                           .Select(x=> 
                                   new Pedestrian() 
                                   {
                                       Name = x.Attribute("Name").Value, 
                                       X1 = int.Parse(x.Element("Initial_Position").Attribute("In_X").Value),
                                       Y1 = int.Parse(x.Element("Initial_Position").Attribute("In_Y").Value),
                                       X2 = int.Parse(x.Element("Final_Position").Element("First") .Attribute("Fin_X").Value),
                                       Y2 = int.Parse(x.Element("Final_Position").Element("First") .Attribute("Fin_Y").Value)
                                   });
      

      输出

       Name  : Mother
       X1    : 3
       X2    : 6
       Y1    : 3
       Y2    : 6
      

      查看Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        相关资源
        最近更新 更多