【问题标题】:How to Check a Particular Element has a Value or another class inside it?如何检查特定元素中是否有值或其他类?
【发布时间】:2020-02-11 07:21:22
【问题描述】:

如何检查一个特定的元素是否有值或内部元素? 在这里我有一个学生列表,通过使用名称作为搜索键将他们的结果显示到 Richtextbox 但在这里我遇到了像学生一样的 smith 问题,我在其中还有一个表格作为标记列表,如何检查并显示 该特定元素是否具有价值或元素? 我正在使用 C# 和 LINQ 来检索数据。

<StudentDataset>
  <Student>
    <Name>Raj</Name>
    <TotalMarks>330</TotalMarks>
    <Year>2009+5</Year>
  </Student>

  <Student>
    <Name>Dennis</Name>
    <TotalMarks>514</TotalMarks>
    <Year>2009</Year>
  </Student>
  <Student>
    <Name>Lisa</Name>
    <TotalMarks>510</TotalMarks>
    <Year>2011</Year>
  </Student>
  <Student>
    <Name>Rahul</Name>
    <TotalMarks>490</TotalMarks>
    <Year>2019</Year>
  </Student>
  <Student>
    <Name>Smith</Name>
    <TotalMarks>
      <IndividualScores>
        <Table Mode="SSC">
          <Item Marks="40" Result="10.6" />
          <Item Marks="100" Result="6.4" />
          <Item Marks="110" Result="5.7" />
          <Item Marks="120" Result="5" />
          <Item Marks="130" Result="4.3" />
          <Item Marks="140" Result="3.5" />
          <Item Marks="150" Result="2.8" />
        </Table>
        <Table Mode="Inter">
          <Item Marks="40" Result="8.8" />
          <Item Marks="50" Result="8.8" />
          <Item Marks="60" Result="8.8" />
          <Item Marks="70" Result="8.8" />
          <Item Marks="80" Result="8.8" />
        </Table>
      </IndividualScores>
    </TotalMarks>
    <Year>2013</Year>
  </Student>
  <Student >
        <Name>Jessy </Name>
        <TotalMarks><SchoolName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt; /.>
<English>88</English>
<Mathematics>90</mathematics>
<Science>98</science>
</SchoolName>
 </TotalMarks>
        <Year>2014</Year>
      </Student>

</StudentDataset>

C#

XDocument doc = XDocument.Load(@"filename");
IEnumerable<XElement> AllStudntElements = doc.Root.Elements();
var SelectDataByName = from element in AllStudntElements
where element.Element("Name").Value == SearchtItem
select element;

为每个循环使用它对每个学生都非常有效,但就像 smith 一样,如何检查总分是否具有内部元素以及如何将分数和结果显示为像 smith 这样的学生的列表? 我已经尝试了 has children,hasAttribute 之类的所有方法,但没有给出正确的结果?

对于 Jesse,我有 XML 模式,对于 Smith,我有一个表 如何知道一个元素是否有值或元素或架构?

对 XML 非常陌生,如何使用 XmlReader 以及如何破解这个东西? 一直在尝试 4 天,但不知道...

【问题讨论】:

    标签: c# xml winforms xlsx


    【解决方案1】:

    尝试使用 xml linq 进行以下操作:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    using System.Data;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                List<Student> students = Student.GetStudents(FILENAME);
                DataTable dt = Student.CreateTable(students);
            }
        }
        public class Student
        {
            public string Name { get; set; }
            public string Year { get; set; }
            public int? intTotalMarks { get; set; }
            public List<TotalMarks> totalMarks { get; set; }
    
            public static List<Student> GetStudents(string filename)
            {
                XDocument doc = XDocument.Load(filename);
                List<Student> students = new List<Student>();
    
                foreach (XElement xStudent in doc.Descendants("Student"))
                {
                    Student student = new Student();
                    students.Add(student);
    
                    student.Name = (string)xStudent.Element("Name");
                    student.Year = (string)xStudent.Element("Year");
    
                    XElement xMarks = xStudent.Element("TotalMarks");
                    if (xMarks.HasElements)
                    {
                        foreach (XElement table in xStudent.Descendants("Table"))
                        {
                            TotalMarks totalMarks = new TotalMarks();
                            if (student.totalMarks == null) student.totalMarks = new List<TotalMarks>();
                            student.totalMarks.Add(totalMarks);
    
                            totalMarks.mode = (string)table.Attribute("Mode");
                            totalMarks.marks = table.Elements("Item").Select(x => new Mark()
                            {
                                mark = (int)x.Attribute("Marks"),
                                result = (decimal)x.Attribute("Result")
                            }).ToList();
                        }
                    }
                    else
                    {
                        student.intTotalMarks = (int)xMarks;
                    }
                }
    
                return students;
            }
            public static DataTable CreateTable(List<Student> students)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Year", typeof(string));
                dt.Columns.Add("Mode", typeof(string));
                dt.Columns.Add("Mark", typeof(int));
                dt.Columns.Add("Result", typeof(decimal));
    
                foreach(Student student in students)
                {
                    if (student.totalMarks == null)
                    {
                        dt.Rows.Add(new object[] {
                                student.Name,
                                student.Year,
                                null,
                                student.intTotalMarks
                        });
                    }
                    else
                    {
                        foreach (TotalMarks totalMark in student.totalMarks)
                        {
                            foreach (Mark mark in totalMark.marks)
                            {
                                dt.Rows.Add(new object[] {
                                student.Name,
                                student.Year,
                                totalMark.mode,
                                mark.mark,
                                mark.result
                            });
                            }
                        }
                    }
    
                }
                return dt;
            }
        }
        public class TotalMarks
        {
            public string mode { get; set; }
            public List<Mark> marks { get; set; }
    
        }
        public class Mark
        {
            public int mark { get; set; }
            public decimal result { get; set; }
        }
    }
    

    【讨论】:

    • 你能解释得更好吗?输出为:列出 学生
    • 我的意思是如何以这种格式为像学生一样的 smith 生成输出? Name : Smith SSC: Marks=40 Result=10.6 Marks=100 Result=6.4 Marks=110 Result=5.7 Marks=120 Result=5 Marks=130 Result=4.3 Marks=140 Result=3.5 Marks=150 Result=2.8 Inter: Marks=40 Result=8.8 Marks=50 Result=8.8 Marks=60 Result=8.8 Marks=70 Result=8.8 Year:2013
    • 对于 Jessy,存在 XmlSchema 我如何区分总分是否具有价值或内部元素或架构感到困惑如何处理?
    • Jessy 应该是这样的:w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema"&gt;>Jessy</Name>
    • 先生,不,我只有 TotalMarks 我希望我可以发送图像,但我不知道如何将图像保存在这里
    【解决方案2】:

    按照您提供的代码:

    使用 LINQ 选择 Student 的子“表格”元素。

     var studentTables = from tables in SelectDataByName.Descendants("Table")
            select tables;
    
     if (studentTables.Any())
     {
           // do something
     }
    

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多