为了账号安全,请及时绑定邮箱和手机立即绑定

将带有点 (.) 的 XML 标记映射到 C# 对象

将带有点 (.) 的 XML 标记映射到 C# 对象

C#
拉丁的传说 2022-06-18 17:13:16
我有一些带有点(。)的标签的 XML 文件,现在我正在使用“StringWriter”用 C# 映射 XML 数据,但我无法处理标签名称中带有点(。)的 XML 标签,例如:-” Customer.Name”,我如何将其映射到 C# 类。我已经用我的类模型给了 XmlElement,但我仍然没有用我的类获得值映射。任何人都可以给我建议。[XmlElement(ElementName = "PARENTNAME")]   public string PARENTNAME { get; set; }  //This is perfect mapped[XmlElement(ElementName = "DISPLAYCONTACT.CONTACTNAME")]public string DISPLAYCONTACTCONTACTNAME { get; set; } // This is not mapped[XmlElement(ElementName = "DISPLAYCONTACT.COMPANYNAME")]public string DISPLAYCONTACTCOMPANYNAME { get; set; }将 XML 转换为 C#XmlDocument doc = new XmlDocument();doc.LoadXml(custome‌rString);StringWriter sw = new StringWriter();XmlTextWriter xw = new XmlTextWriter(sw);doc.WriteTo(xw);String XmlString = sw.ToString();string xmlToJson = JsonConvert.SerializeXmlNode(doc);var deserialized = JsonConvert.SerializeXmlNode(doc);var custome‌r = new CusGetResIn();custome‌r= JsonConvert.DeserializeObject<CusGetResIn>(deserialized);也试过: -XmlSerializer serializer = new XmlSerializer(typeof(CusGetResIn));MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(XmlString));CusGetResIn resultingMessage = (CusGetResIn)serializer.Deserialize(memStream);
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

快速测试节目XmlSerializer可以很容易地处理这个问题


测试类:


[XmlRoot]

public class Test

{

    [XmlElement(ElementName="Foo.Alpha")]

    public string Alpha {get;set;}


    [XmlElement(ElementName="Foo.Beta")]

    public string Beta {get;set;}

}

示例方法:


private static void Main()

{

    var src = @"<Test>

    <Foo.Alpha>value 1</Foo.Alpha>

    <Foo.Beta>value 2</Foo.Beta>

    </Test>";


    using (var sreader = new StringReader(src))

    using (var reader = XmlReader.Create(sreader))

    {

        var serializer = new XmlSerializer(typeof(Test));

        var test = (Test)serializer.Deserialize(reader);

        Console.WriteLine(test.Alpha);

        Console.WriteLine(test.Beta);

    }

}

更新:由于您正在处理的 XML 文档非常大,您应该考虑您实际需要做什么。如果您需要将整个文档作为对象进行操作,那么 JP Hellemons 的答案中采用的方法可能是可行的方法。如果您只对某些字段感兴趣,那么最好将 XML 加载到XDocumentorXmlDocument中并从中提取您感兴趣的字段,或者甚至编写一个只进的解析器XmlReader来做同样的事情。


查看完整回答
反对 回复 2022-06-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

我已将您的 XML 粘贴到XMLFile1.xml中并将其粘贴到 Visual Studio 中以生成类,因此这将是很多自动生成的代码...警告


不适合自动生成代码...


正文限制为 30000 个字符;你输入了 93977


完整代码在这里: https ://pastebin.com/VxzNUjsv


较小的版本:


<?xml version="1.0" encoding="UTF-8"?>

<customer>

  <RECORDNO>5</RECORDNO>

  <CUSTOMERID>CUST-00101</CUSTOMERID>

  <PARENTNAME>parent</PARENTNAME>

  <DISPLAYCONTACT.CONTACTNAME>Sun Microsystems - EBC(CCUST-00101)</DISPLAYCONTACT.CONTACTNAME>

  <DISPLAYCONTACT.COMPANYNAME>Sun Microsystems - EBC</DISPLAYCONTACT.COMPANYNAME>

</customer>

和 C# 代码:


class Program

    {

        static void Main(string[] args)

        {


            using (var sreader = new StringReader(File.ReadAllText(@"C:\Users\JP\source\repos\soXmlParsing\soXmlParsing\XMLFile1.xml")))

            using (var reader = XmlReader.Create(sreader))

            {

                var serializer = new XmlSerializer(typeof(customer));

                var test = (customer)serializer.Deserialize(reader);

                Console.WriteLine(test.PARENTNAME);

                Console.WriteLine(test.DISPLAYCONTACTCONTACTNAME);

            }

        }

    }



    // NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.

    /// <remarks/>

    [System.SerializableAttribute()]

    [System.ComponentModel.DesignerCategoryAttribute("code")]

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]

    public partial class customer

    {


        private byte rECORDNOField;


        private string cUSTOMERIDField;


        private string pARENTNAMEField;


        private string dISPLAYCONTACTCONTACTNAMEField;


        private string dISPLAYCONTACTCOMPANYNAMEField;


        /// <remarks/>

        public byte RECORDNO

        {

            get

            {

                return this.rECORDNOField;

            }

            set

            {

                this.rECORDNOField = value;

            }

        }


        /// <remarks/>

        public string CUSTOMERID

        {

            get

            {

                return this.cUSTOMERIDField;

            }

            set

            {

                this.cUSTOMERIDField = value;

            }

        }


        /// <remarks/>

        public string PARENTNAME

        {

            get

            {

                return this.pARENTNAMEField;

            }

            set

            {

                this.pARENTNAMEField = value;

            }

        }


        /// <remarks/>

        [System.Xml.Serialization.XmlElementAttribute("DISPLAYCONTACT.CONTACTNAME")]

        public string DISPLAYCONTACTCONTACTNAME

        {

            get

            {

                return this.dISPLAYCONTACTCONTACTNAMEField;

            }

            set

            {

                this.dISPLAYCONTACTCONTACTNAMEField = value;

            }

        }


        /// <remarks/>

        [System.Xml.Serialization.XmlElementAttribute("DISPLAYCONTACT.COMPANYNAME")]

        public string DISPLAYCONTACTCOMPANYNAME

        {

            get

            {

                return this.dISPLAYCONTACTCOMPANYNAMEField;

            }

            set

            {

                this.dISPLAYCONTACTCOMPANYNAMEField = value;

            }

        }

    }


查看完整回答
反对 回复 2022-06-18
  • 2 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号