【问题标题】:How to compare values from XML elements and sub elements in c#如何在 C# 中比较 XML 元素和子元素的值
【发布时间】:2019-10-09 13:10:25
【问题描述】:

我想将来自用户输入的值与来自 XML 元素的值进行比较,并从另一个 XML 元素中选择值。 例如: 请考虑以下 XML:

<?xml version="1.0" encoding="utf-8" ?>
<CardTypes>
  <Card>
    <DccCardIssueNumber>99</DccCardIssueNumber>
    <DccCardIssuerName>VIS</DccCardIssuerName>
    <DccCardIssuerFullName>VISHAL</DccCardIssuerFullName>
    <RPOSCardType>1600</RPOSCardType>
    <DeliveryNote>false</DeliveryNote>
  </Card>
  <Card>
    <DccCardIssueNumber>20</DccCardIssueNumber>
    <DccCardIssuerName>VIS</DccCardIssuerName>
    <DccCardIssuerFullName>VISA</DccCardIssuerFullName>
    <RPOSCardType>1600</RPOSCardType>
    <DeliveryNote>false</DeliveryNote>
    <SubType>
      <DccCardIssueSubTypeNumber>1</DccCardIssueSubTypeNumber>
      <DccCardIssueSubTypeName>VIS</DccCardIssueSubTypeName>
      <DccCardIssueSubTypeFullName>VISA</DccCardIssueSubTypeFullName>
      <RPOSCardType>1600</RPOSCardType>
      <DeliveryNote>false</DeliveryNote>
    </SubType>
    <SubType>
      <DccCardIssueSubTypeNumber>2</DccCardIssueSubTypeNumber>
      <DccCardIssueSubTypeName>DKV</DccCardIssueSubTypeName>
      <DccCardIssueSubTypeFullName>DKV</DccCardIssueSubTypeFullName>
      <RPOSCardType>2510</RPOSCardType>
      <DeliveryNote>false</DeliveryNote>
    </SubType>
  </Card>
</CardTypes> 

现在,最初,我正在检查用户提供的 DccCardIssueNumber,如果匹配,我想检查我们是否有该卡的 SubType。 如果 subtype 存在,我想打印 DccCardIssueSubTypeFullName,如果 SubType 不存在,我只想打印 DccCardIssuerFullName

到目前为止,我已经实现了这个:

    using (XmlReader xr = XmlReader.Create("DccCardTypeMap.xml"))
    {
        while (xr.Read())
        {
            if (xr.IsStartElement())
            {
                switch (xr.Name.ToString())
                {
                    case "DccCardIssueNumber":
                        if (y == "")
                        {
                            if (xr.ReadString() == x)
                            {
                                xr.ReadToFollowing("DccCardIssuerFullName");
                                transaction.CardTypeName = xr.ReadString();
                            }
                        }
                        else
                        {


                            if (xr.ReadString() == x)
                            {

                                xr.ReadToFollowing("DccCardIssueSubTypeNumber");
                                if (xr.ReadString() == y)
                                {


                                    xr.ReadToFollowing("DccCardIssueSubTypeFullName");
                                    transaction.CardTypeName = xr.ReadString();
                                }

                            }
                        }
                        break;
                }
            }
        }
    }

这里,y 表示子类型编号(1 或 2),x 表示 DCCCardIssueNumber

【问题讨论】:

  • 你为什么使用XmlReader而不是通过XmlSerializerXDocument将整个模型读入内存?实际文件是否太大以至于无法读取?

标签: c# xml xml-parsing


【解决方案1】:

试试 xml linq。我用字典按数字对卡片进行分组

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Card> cards = doc.Descendants().Where(x => (x.Name.LocalName == "Card") || (x.Name.LocalName == "SubType"))
                .Select(x => new Card()
                {
                    DccCardIssueNumber = (string)x.Element("DccCardIssueNumber") + (string)x.Element("DccCardIssueSubTypeNumber"),
                    DccCardIssuerName = (string)x.Element("DccCardIssuerName") + (string)x.Element("DccCardIssueSubTypeName"),
                    DccCardIssuerFullName = (string)x.Element("DccCardIssuerFullName") + (string)x.Element("DccCardIssueSubTypeFullName"),
                    RPOSCardType = (string)x.Element("RPOSCardType"),
                    DeliveryNote = (string)x.Element("DeliveryNote")
                }).ToList();

            Dictionary<string, List<Card>> dict = cards.GroupBy(x => x.DccCardIssueNumber, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());
        }
    }
    public class Card
    {
        public string DccCardIssueNumber { get; set; }
        public string DccCardIssuerName { get; set; }
        public string DccCardIssuerFullName { get; set; }
        public string RPOSCardType { get; set; }
        public string DeliveryNote { get; set; }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2016-01-21
    • 2020-07-16
    • 2015-05-05
    相关资源
    最近更新 更多