Как подсчитать тег xml с определенным значением для создания сводки c#; asp.net

Мне трудно понять, как подсчитать тег XML с определенным значением. Затем поместите это в текстовое поле. Я дошел до десериализации данных в XML-файле, но не могу понять, как получить сводку Вот следующий код, который у меня есть:

код за файлом: index.aspx.cs

protected void summaryReport ()
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Xml2CSharp.Registrations));
    FileStream fileStream = null;

    try
    {
        fileStream = new FileStream(fullFileName, FileMode.Open);
    }
    catch
    {
        txtSummary.Text = "Error: Xml file not Found.";
        return;
    }

    Registrations registrationList = (Registrations)xmlSerializer.Deserialize(fileStream);
    fileStream.Close();

    txtSummary.Text = "There are " + ...numberofattendants... + " People attending the conference.";
}

XML-файл: registrations.xml

<registrations>
      <Registration>
         <id>1</id>
         <fullName>Keiran Bernal</fullName>
         <emailAddress>k.bernal@gmail.com</emailAddress>
         <registrationType>conference only</registrationType>
         <attendingSocialEvent>yes</attendingSocialEvent>
      </Registration>
      <Registration>
         <id>2</id>
         <fullName>Cordelia Pierce</fullName>
         <emailAddress>c.pierce@outlook.com</emailAddress>
         <registrationType>conference and Dinner</registrationType>
         <attendingSocialEvent>no</attendingSocialEvent>
      </Registration>
      <Registration>
         <id>3</id>
         <fullName>Zachery Guy</fullName>
         <emailAddress>z.guy@yahoo.com</emailAddress>
         <registrationType>conference only</registrationType>
         <attendingSocialEvent>yes</attendingSocialEvent>
      </Registration>
      <Registration>
         <id>4</id>
         <fullName>Kiana Hawworth</fullName>
         <emailAddress>k.hawworth@bigpond.com</emailAddress>
         <registrationType>conference and Dinner</registrationType>
         <attendingSocialEvent>no</attendingSocialEvent>
      </Registration>
   </registrations>

Класс помощника: registrations.cs

namespace Xml2CSharp
{

    [XmlRoot(ElementName = "Registration")]
    public class Registration
    {
        [XmlElement(ElementName = "id")]
        public string id { get; set; }
        [XmlElement(ElementName = "fullName")]
        public string fullName { get; set; }
        [XmlElement(ElementName = "emailAddress")]
        public string emailAddress { get; set; }
        [XmlElement(ElementName = "registrationType")]
        public string registrationType { get; set; }
        [XmlElement(ElementName = "attendingSocialEvent")]
        public string attendingSocialEvent { get; set; }

        public Registration()
        {
            this.id = null;
            this.fullName = null;
            this.emailAddress = null;
            this.registrationType = null;
            this.attendingSocialEvent = null;
        }

        public Registration(string id, string fullName, string emailAddress, string registrationType, string attendingSocialEvent)
        {
            this.id = id;
            this.fullName = fullName;
            this.emailAddress = emailAddress;
            this.registrationType = registrationType;
            this.attendingSocialEvent = attendingSocialEvent;
        }
    }

    [XmlRoot(ElementName = "registrations")]
    public class Registrations
    {
        [XmlElement(ElementName = "Registration")]
        public List<Registration> registrationList { get; set; }

        public Registrations()
        {
            this.registrationList = new List<Registration>();
        }
    }  
}

Форма ASP.NET: index.cs

<form>
    <div>
        <asp:Label ID="lblSummary" runat="server" Text="Summary:" CssClass="lblsummary"></asp:Label><br />
        <asp:TextBox ID="txtSummary" runat="server" TextMode="MultiLine" CssClass="txtsummary" Columns="50" Rows="5"></asp:TextBox>
    </div>
</form>

Моя цель - подсчитать количество тегов XML со значением «Да», а затем поместить это в сводку. Я считаю, что мне придется каким-то образом поместить это в переменную, но не знаю, как и как считать только те, у которых есть значение «Да».

Нашел решение, которое было опубликовано до того, как это сработало для меня. stackoverflow.com/a/4650961/10498504

Jason Crisp 01.11.2018 14:42
1
1
143
2

Ответы 2

После десериализации XML в объект Registrations вы можете использовать Linq для подсчета регистраций:

Registrations registrations = ....;

// check if registrations.registrationList is not null before doing this
int count = registrations.registrationList.Count(x =>
    x.attendingSocialEvent.Equals("yes", StringComparison.OrdinalIgnoreCase));

Или, в качестве альтернативы, добавьте несериализуемое свойство в класс Registrations следующим образом:

[XmlRoot(ElementName = "registrations")]
public class Registrations
{
    [XmlIgnore]
    public int CountAttendances
    {
        get
        {
            if (registrationList == null)
            {
                return 0;
            }

            int count = registrationList.Count(x => x.attendingSocialEvent.Equals("yes", StringComparison.OrdinalIgnoreCase));

            return count;
        }
    }

    [XmlElement(ElementName = "Registration")]
    public List<Registration> registrationList { get; set; }

    public Registrations()
    {
        this.registrationList = new List<Registration>();
    }
}

Вам действительно не нужно десериализовать POCO, если подсчет - это все, что вы хотите сделать ...

Вы можете подсчитать количество респондентов "yes", используя LINQ, следующим образом:

var xmlStr = @"<registrations>
      <Registration>
         <id>1</id>
         <fullName>Keiran Bernal</fullName>
         <emailAddress>k.bernal@gmail.com</emailAddress>
         <registrationType>conference only</registrationType>
         <attendingSocialEvent>yes</attendingSocialEvent>
      </Registration>
      <!-- SNIP -->
   </registrations>";

var doc = XDocument.Parse(xmlStr);
var numYes = doc.Descendants("Registration")
                .Count(r => string.Equals((string)r.Element("attendingSocialEvent"), 
                                          "yes", 
                                          StringComparison.OrdinalIgnoreCase))

Другие вопросы по теме