C#中如何对比XML元素与子元素值并根据用户输入获取对应字段
嘿,我把你整理的需求、示例XML和已实现代码用清晰的Markdown格式梳理好了,方便你查看和分享:
需求与代码实现梳理
核心需求
我们需要实现一个XML数据匹配逻辑,具体规则如下:
- 先匹配用户输入的
DccCardIssueNumber(对应变量x),找到对应的<Card>节点 - 检查该
<Card>节点是否包含<SubType>子节点:- 如果存在
<SubType>且用户提供了子类型编号y,则匹配对应的<DccCardIssueSubTypeNumber>,成功后获取<DccCardIssueSubTypeFullName>赋值给transaction.CardTypeName - 如果不存在
<SubType>或未提供y,则直接获取该<Card>下的<DccCardIssuerFullName>赋值给transaction.CardTypeName
- 如果存在
示例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>
当前已实现的C#代码
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内容
内容的提问来源于stack exchange,提问作者vishal
相关产品推荐
相关产品推荐

