c# - 当xml有多个相同元素时,如何将xml元素与C#模型绑定?
问题描述
我无法将我的 c# 模型与这种 xml 文件绑定。因为有多个相同的元素。这是我的 XML 文件的一个示例。
<Type>
<Loop LoopId="2100A" Name="MEMBER NAME">
<PER>
<!--Contact Function Code-->
<PER01>IP<!--Insured Party--></PER01>
<PER02 />
<!--Communication Number Qualifier-->
<PER03>HP<!--Home Phone Number--></PER03>
<!--Communication Number-->
<PER04>6235834409</PER04>
</PER>
</Loop>
<Loop LoopId="2100C" Name="MEMBER MAILING ADDRESS">
<NM1>
<!--Entity Identifier Code-->
<NM101>31<!--Postal Mailing Address--></NM101>
<!--Entity Type Qualifier-->
<NM102>1<!--Person--></NM102>
</NM1>
</Loop>
<Loop LoopId="2100G" Name="RESPONSIBLE PERSON">
<PER>
<!--Contact Function Code-->
<PER01>IP<!--Insured Party--></PER01>
<PER02 />
<!--Communication Number Qualifier-->
<PER03>HP<!--Home Phone Number--></PER03>
<!--Communication Number-->
<PER04>6235834409</PER04>
</PER>
<LM>
<!--Contact Function Code-->
<LM01>RP<!--Responsible Person--></LM01>
<LM02 />
</LM>
</Loop>
</Type>
我已经使用以下代码进行绑定。但是代码不起作用,导致数据绑定变得混乱。
[XmlElement(ElementName = "Loop")]
public L3_L1_MemberName L3_L1_MemberName { get; set; }
[XmlElement(ElementName = "Loop")]
public L3_L2_MemberMailingAddress L3_L2_MemberMailingAddress { get; set; }
[XmlElement(ElementName = "Loop")]
public L3_L3_ResponsiblePerson L3_L3_ResponsiblePerson { get; set; }
解决方案
基于您的 XML,模型看起来像
[XmlRoot(ElementName = "PER")]
public class PER
{
[XmlElement(ElementName = "PER01")]
public string PER01 { get; set; }
[XmlElement(ElementName = "PER02")]
public string PER02 { get; set; }
[XmlElement(ElementName = "PER03")]
public string PER03 { get; set; }
[XmlElement(ElementName = "PER04")]
public string PER04 { get; set; }
}
[XmlRoot(ElementName = "Loop")]
public class Loop
{
[XmlElement(ElementName = "PER")]
public PER PER { get; set; }
[XmlAttribute(AttributeName = "LoopId")]
public string LoopId { get; set; }
[XmlAttribute(AttributeName = "Name")]
public string Name { get; set; }
[XmlElement(ElementName = "NM1")]
public NM1 NM1 { get; set; }
[XmlElement(ElementName = "LM")]
public LM LM { get; set; }
}
[XmlRoot(ElementName = "NM1")]
public class NM1
{
[XmlElement(ElementName = "NM101")]
public string NM101 { get; set; }
[XmlElement(ElementName = "NM102")]
public string NM102 { get; set; }
}
[XmlRoot(ElementName = "LM")]
public class LM
{
[XmlElement(ElementName = "LM01")]
public string LM01 { get; set; }
[XmlElement(ElementName = "LM02")]
public string LM02 { get; set; }
}
[XmlRoot(ElementName = "Type")]
public class Type
{
[XmlElement(ElementName = "Loop")]
public List<Loop> Loop { get; set; }
}
DeSerialize
这是XML to Object的逻辑
XmlSerializer serializer = new XmlSerializer(typeof(Type));
string xml = File.ReadAllText("XMLFile3.xml");
using (TextReader reader = new StringReader(xml))
{
var results = (Type)serializer.Deserialize(reader);
foreach (var item in results.Loop)
{
Console.WriteLine($"{item.LoopId} {item.Name}");
if (item.PER != null)
{
Console.WriteLine($"PER:{Regex.Replace(item.PER.PER01, @"\s+", "")}-{Regex.Replace(item.PER.PER02, @"\s+", "")}-{Regex.Replace(item.PER.PER03, @"\s+", "")}-{Regex.Replace(item.PER.PER04, @"\s+", "")}");
}
if (item.NM1 != null)
{
Console.WriteLine($"NM1:{Regex.Replace(item.NM1.NM101, @"\s+", "")}-{Regex.Replace(item.NM1.NM102, @"\s+", "")}");
}
if (item.LM != null)
{
Console.WriteLine($"LM:{Regex.Replace(item.LM.LM01, @"\s+", "")}-{Regex.Replace(item.LM.LM02, @"\s+", "")}");
}
}
}
输出
2100A MEMBER NAME
PER:IP--HP-6235834409
2100C MEMBER MAILING ADDRESS
NM1:31-1
2100G RESPONSIBLE PERSON
PER:IP--HP-6235834409
LM:RP-
推荐阅读
- html - Ionic 3 选择选项样式 css
- javascript - 通过 webpack 向 Laravel 添加时刻
- javascript - Angular 更新表单填充输入字段但仍然在控制台中返回错误?
- hadoop - 使用 DATE over TIMESTAMP 是否有性能改进?
- sql - 如何在通过触发器的字符变化中保存带有逗号的数据?
- ios - 由于某种原因,托管对象上下文在 iOS 中为零
- unity3d - 无法列出目标平台 Unity 2018.1.0f2
- android - 如何初始化 BLE 设备以发送一些字符串?
- android - FCM 15.0.2 无法使用 Dexguard 在发布版本中制作令牌
- android - 通知推送 ruby on rails with firebase for ios and android