如何检查特定元素中是不是有值或其他类?

Posted

技术标签:

【中文标题】如何检查特定元素中是不是有值或其他类?【英文标题】: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 天,但不知道...

【问题讨论】:

【参考方案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
 

【讨论】:

以上是关于如何检查特定元素中是不是有值或其他类?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查元素是不是没有特定的类?

jquery - 如何检查元素是不是附加了任何类

如何在 1-N 表关系中选择特定值或任何其他值

确定 NSUInteger 是不是有值或为零

如何检查接口引用是不是是特定类[重复]

如何在 jQuery 验证中检查元素是不是具有类?