【问题标题】:How do i extract specific attributes while iterating through an XML document (XML Parsing) using C#如何在使用 C# 遍历 XML 文档(XML 解析)时提取特定属性
【发布时间】:2020-10-31 09:37:18
【问题描述】:

我是 c# 的新手,因此我希望你们中的一些人可以帮助我解决这个问题:

我有一个包含多个节点和属性的长 XML 文件。我正在寻找一种关于如何遍历 XML 文档的方法,同时能够设置一种方法来提取某些感兴趣的属性,然后将这些属性存储在一个数组中(目标是之后通过存储在集合中来可视化它们)。

我尝试过多种方式来解决这个问题,例如使用 get Xpathdeserialization 等等,不幸的是它们都没有成功,尤其是 <TeamData> 出现不止一次。

XML 文件如下所示:

- <SoccerFeed TimeStamp="20190818T190845+0100">
  - <SoccerDocument Type="Result" detail_id="1" uID="f1059230">
     - <MatchData>
          - <TeamData Formation="433" Score="2" Side="Home" TeamRef="t239">
            <Booking Card="Yellow" CardType="Yellow" EventID="6020960" EventNumber="1141" Min="13" 
             Period="FirstHalf" PlayerRef="p112340" Reason="Foul" Sec="31" Time="14" 
             TimeStamp="20190818T171443+0100" uID="b239-1" />
            </TeamData> 
          - <TeamData TeamRef="t401" Side="Away" Score="1" Formation="433">
             <Booking TimeStamp="20190818T182120+0100" uID="b401-1" Period="SecondHalf" Time="64" 
              Sec="15" Reason="Foul" PlayerRef="p229218" Min="63" EventNumber="2648" 
              EventID="708326435" CardType="Yellow" Card="Yellow"/>
             </TeamData>
        </MatchData>
  </SoccerDocument

这是我目前的想法:

    int totalC;
    XmlDocument xmlDoc = new XmlDocument();
    string XMLpath = Directory.GetCurrentDirectory() + 
     @"File.xml";
    xmlDoc.Load(XMLpath);

    XmlNodeList Clist = xmlDoc.GetElementsByTagName("TimeStamp");
    totalC = Clist.Count;

    for (int i = 0; i < Clist.Count; i++)
    {
        Console.WriteLine(Clist[i].InnerText.ToString());
    }
    Console.WriteLine(Environment.NewLine);
    Console.WriteLine(totalC.ToString() + " hello");
    Console.ReadLine();

希望我的问题足够清楚,提前谢谢!

【问题讨论】:

    标签: c# xml parsing using


    【解决方案1】:

    您可以使用LINQ to XML轻松做到这一点

     var doc = XDocument.Load(@"Test.xml");
    
     var distinctResults = doc.Descendants("Booking")
                           .Select(element => element.Attribute("TimeStamp").Value)
                           .Distinct().ToArray();
    

    没有 LINQ to XML -

    XmlDocument xmlDoc = new XmlDocument();
    string XMLpath = @"Test.xml";
    xmlDoc.Load(XMLpath);
    List<string> attributes = new List<string>();          
    
    XmlNodeList nodes = xmlDoc.GetElementsByTagName("Booking");
    foreach (XmlElement n in nodes)
       {
          XmlAttributeCollection attributesData = n.Attributes;
          foreach (XmlAttribute at in atributesData)
             {
                if (at.LocalName.Contains("TimeStamp"))
                   {
                       attributes.Add(at.Value);
                   }
              }
        }
    

    【讨论】:

      【解决方案2】:

      我认为在这种情况下,由于数据中的属性和数组的数量,您应该使用 Xml 序列化

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Serialization;
      using System.IO;
      using System.Globalization;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              const string FILENAME = @"c:\temp\test.xml";
              static void Main(string[] args)
              {
                  string xml = File.ReadAllText(FILENAME);
                  StringReader sReader = new StringReader(xml);
                  XmlReader xReader = XmlReader.Create(sReader);
      
                  XmlSerializer serializer = new XmlSerializer(typeof(SoccerFeed));
                  SoccerFeed soccerFeed = (SoccerFeed)serializer.Deserialize(xReader);
      
      
              }
          }
          public class SoccerFeed
          {
              private DateTime _TimeStamp { get; set; }
              [XmlAttribute]
              public string TimeStamp
              {
                  get { return _TimeStamp.ToString("yyyyMMddTHHmmss+ffff"); }
                  set { _TimeStamp = DateTime.ParseExact(value, "yyyyMMddTHHmmss+ffff", CultureInfo.InvariantCulture); }
              }
      
      
              public SoccerDocument SoccerDocument { get; set; }
          }
          public class SoccerDocument
          {
      
              [XmlAttribute]
              public int detail_id { get; set; }
              [XmlAttribute]
              public string uID { get; set; }
      
              [XmlArray("MatchData")]
              [XmlArrayItem("TeamData")]
              public List<TeamData> teamData { get; set; }
          }
          public class TeamData
          {
              [XmlAttribute]
              public int Formation { get; set; }
              [XmlAttribute]
              public int Score { get; set; }
              [XmlAttribute]
              public string Side { get; set; }
              [XmlAttribute]
              public string TeamRef { get; set; }
      
              public Booking Booking { get; set; } 
          }
          public class Booking
          {
              [XmlAttribute]
              public string Card { get; set; }
              [XmlAttribute]
              public string CardType { get; set; }
              [XmlAttribute]
              public string EventID { get; set; }
              [XmlAttribute]
              public int EventNumber { get; set; }
              [XmlAttribute]
              public int Min { get; set; }
              [XmlAttribute]
              public string Period { get; set; }
              [XmlAttribute]
              public string PlayerRef { get; set; }
              [XmlAttribute]
              public string Reason { get; set; }
              [XmlAttribute]
              public int Sec { get; set; }
              [XmlAttribute]
              public int Time { get; set; }
      
              private DateTime _TimeStamp { get; set; }
              [XmlAttribute]
              public string TimeStamp
              {
                  get { return _TimeStamp.ToString("yyyyMMddTHHmmss+ffff"); }
                  set { _TimeStamp = DateTime.ParseExact(value, "yyyyMMddTHHmmss+ffff", CultureInfo.InvariantCulture); }
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 2023-03-21
        • 2015-12-12
        • 2021-08-16
        相关资源
        最近更新 更多