【问题标题】:How to select a Node by it's atrribute name and get it's child node in C#?如何通过属性名称选择节点并在 C# 中获取它的子节点?
【发布时间】:2013-03-29 18:05:55
【问题描述】:

这是我的 XML 代码(module.xml)

<module code="ECSE502">
  <code>ECSE502</code>
  <name>Algorithms and Data structures</name>
  <semester>1</semester>
  <prerequisites>none</prerequisites>
  <lslot>0</lslot>
  <tslot>1</tslot>
  <description>all about algorythms and data structers</description>
</module>
<module code="EIGA501">
  <code>EIGA501</code>
  <name>3D Grapgics I</name>
  <semester>1</semester>
  <prerequisites>none</prerequisites>
  <lslot>2</lslot>
  <tslot>3</tslot>
  <description>xxxxxxxxxxxxxxxxxxxxxx</description>
</module>

根据上面的 xml 代码,我只需要输入 ECSE502 作为输入来获取集合。 选择所需节点后,我还需要获取其子节点的值(名称、学期等)。 在 XML 文件中有 20 个节点。这只是第一个 2 个节点。

到目前为止我已经尝试过了

 XmlTextReader reader = new XmlTextReader("modules.xml");
            XmlDocument doc = new XmlDocument();
            XmlNode node = doc.ReadNode(reader);

        foreach (XmlNode chldNode in node.ChildNodes)
            Console.WriteLine(reader.Value);

【问题讨论】:

    标签: c# xml visual-studio-2010


    【解决方案1】:

    你可以使用LINQ to XML,假设这里的代码返回匿名对象列表,但是如果你愿意,你可以显式定义你自己的类:

    var xDoc = XDocument.Load("yourpathfile");
    var result = xDoc.Descendants("module")
                .Where(x => (string) x.Element("code") == "ECSE502")
                .Select(x => new
                                 {
                                     Name = (string)x.Element("name"),
                                     //.....
                                 });
    

    【讨论】:

    • @Ravindu:也试试这个方法 :)
    【解决方案2】:

    试试这个:

    将您的 xml 包装在一个唯一的根节点中,即

    <modules>
       <module code...
           ..
       </module>
       <module code...
    </modules>
    

    然后

    string text="ECSE502";
    
    XmlDocument xml = new XmlDocument();
    xml.Load("physical path to module.xml"); 
    
    XmlNodeList xnList = xml.SelectNodes("modules/module[@code='"+text+"']");
    foreach (XmlNode xn in xnList)
    {
        string code = xn.SelectSingleNode("code").innerText;
        string name=  xn.SelectSingleNode("name").innerText;
        //and similarly find other inner nodes
    }
    

    【讨论】:

    • 无效。它在行中做了什么, XmlNodeList xnList = xml.SelectNodes("/module[@code='"+text+"']");
    • 尝试将您的模块包装在根标签中。即
    • 它只查找那些将其代码属性作为文本的模块节点
    • 是的,它正在工作。但是所有数据都在一行中,ECSE502Algorithms 和 Datastructures1none01 我怎样才能根据那里的节点来划分它们
    【解决方案3】:

    使用以下代码在您的 xml 中创建根节点后尝试

    XDocument xdoc = XDocument.Load(@"D:\data\rvyas\Projects\Client\module.xml");
    
    
    string code = "ECSE502";
        var result = xdoc.Descendants("module")
                    .Where(x => (string)x.Element("code") == code)
                    .Select(x => new
                    {
                        Name = (string)x.Element("name"),
                        Code = (string)x.Element("code"),
                        semester = (string)x.Element("semester"),
                        prerequisites = (string)x.Element("prerequisites"),
                        lslot = (string)x.Element("lslot"),
                        tslot = (string)x.Element("tslot")
    
                    }).ToList();
    

    你的 XML 应该是这样的:

    <root>
    <module code="ECSE502">
      <code>ECSE502</code>
      <name>Algorithms and Data structures</name>
      <semester>1</semester>
      <prerequisites>none</prerequisites>
      <lslot>0</lslot>
      <tslot>1</tslot>
      <description>all about algorythms and data structers</description>
    </module>
    <module code="EIGA501">
      <code>EIGA501</code>
      <name>3D Grapgics I</name>
      <semester>1</semester>
      <prerequisites>none</prerequisites>
      <lslot>2</lslot>
      <tslot>3</tslot>
      <description>xxxxxxxxxxxxxxxxxxxxxx</description>
    </module>
    </root>
    

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多