【问题标题】:How can i bind xml element with C# model when xml have multiple Same Element?当xml有多个相同元素时,如何将xml元素与C#模型绑定?
【发布时间】:2020-02-19 08:57:22
【问题描述】:

我无法将我的 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; }

【问题讨论】:

    标签: c# xml data-binding deserialization


    【解决方案1】:

    基于您的 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-
    

    【讨论】:

    • @akb,问题出在 XML 序列化上?
    • No.. XML反序列化
    • 3 个循环包含不同的元素。那就是它变得混乱了。
    • @akb,已根据新 XML 进行了修改。您可以将此标记为答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多