如何将XML数据解析为C#对象属性 [英] How to parse XML data into C# object properties

查看:57
本文介绍了如何将XML数据解析为C#对象属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有XML数据,我想将其转换为C#对象属性。我已经尝试过反序列化,但它没有将名称和值分离到属性中。



XML示例:



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

< xfdf xmlns =http://ns.adobe.com/xfdf/xml :space =preserve>

< fields>

< field name =Company Name>

< value> ; ABC



< field name =公司地址>

< value> Chicago



< field name =公司电话>

< value> 123-456-7894



< field name =ACSysHP_ASHP_135k_240k_MeasureID>

< value> 2635









我尝试过:



这是我的主类:< br $>


I have XML data which I wants to convert into the C# object properties. I have tried deserializing, but its not separating out name and value in to the properties.

XML Sample:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields>
<field name="Company Name">
<value>ABC

<field name="Company Address">
<value>Chicago

<field name="Company phone">
<value>123-456-7894

<field name="ACSysHP_ASHP_135k_240k_MeasureID">
<value>2635




What I have tried:

This is my Main Class:

mespace TestApp
{
    [XmlTypeAttribute]
    [XmlRootAttribute("xfdf", Namespace = "http://ns.adobe.com/xfdf/")]
    public class XFDF
    {
        [XmlElementAttribute("fields")]
        public Fields fields { get; set; }
    }

    public class Fields
    {
        public Fields()
        {
            field = new List<Field>();
        }
        [XmlElement(ElementName = "field")]
        public List<Field> field { get; set; }
        
    }

    [XmlRoot(ElementName = "field")]
    // [XmlTypeAttribute]
    public class Field
    {
        // "Company City"

        [XmlAttribute("name")]
        public string Name { get; set; }

        [XmlElementAttribute("value")]
        public string value { get; set; }

    }
}









这是表单代码:







This is form Code:

private void button1_Click(object sender, EventArgs e)
        {

            string path = string.Empty;

            path = Directory.GetCurrentDirectory() + @"\XML\Application 1-16-17_data_030617.xml";

            string xData = File.ReadAllText(path);

            var deserializer = new XmlSerializer(typeof(XFDF));
            using (var reader = XmlReader.Create(new StringReader(xData)))
            {
                XFDF test = (XFDF)deserializer.Deserialize(reader);
               // MessageBox.Show("Field Name: " + test.fields[0].field[1885].Name + Environment.NewLine + " value:" + test.fields[0].field[1885].value);
            }
                


        }







它给你的结果如下:

字段名称:公司名称

值:ABC

字段名称:公司地址

值:芝加哥



目前我的班级有一个名为Field的子类,它有2个属性Name和Value:我想要的是拥有一个属性名为CompanyName,当我从Form1调用该属性时,我应该给我ABC。




It gives you result as:
Field Name: Company Name
value: ABC
Field Name: Company Address
value: Chicago

Currently my class has sub class called Field and it has 2 properties Name and Value: What I want in is in as to have a property called CompanyName and when I call that property from Form1, I should give me "ABC".

推荐答案

我不确定它是否是格式错误的结果但是你的代码和XML有很多问题。 XML格式错误,格式正确将是



I'm not sure if its a result of bad formatting but your code and XML has quite a few issues. The XML is malformed, correctly formatted would be

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
	<fields>
		<field name="Company Name">
			<value>ABC</value>
		</field>
		<field name="Company Address">
			<value>Chicago</value>
		</field>
		<field name="Company phone">
			<value>123-456-7894</value>
		</field>
		<field name="ACSysHP_ASHP_135k_240k_MeasureID">
			<value>2635</value>
		</field>
	</fields>
</xfdf>





如果你正在序列化,正确的类结构/符号将如下(注意:我使用了 Xml2CSharp.com |将您的XML示例转换为可与XmlSerializer兼容的C#类 [ ^ ]进行转换我的XML到c#类)





And if you are serializing, the correct class structure/notation would be the following (Note: I used Xml2CSharp.com | Convert your XML Examples into XmlSerializer compatable C# Classes[^] to convert the XML to c# classes for me)

[XmlRoot(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
public class Field {
	[XmlElement(ElementName="value", Namespace="http://ns.adobe.com/xfdf/")]
	public string Value { get; set; }
	[XmlAttribute(AttributeName="name")]
	public string Name { get; set; }
}

[XmlRoot(ElementName="fields", Namespace="http://ns.adobe.com/xfdf/")]
public class Fields {
	[XmlElement(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
	public List<Field> Field { get; set; }
}

[XmlRoot(ElementName="xfdf", Namespace="http://ns.adobe.com/xfdf/")]
public class Xfdf {
	[XmlElement(ElementName="fields", Namespace="http://ns.adobe.com/xfdf/")]
	public Fields Fields { get; set; }
	[XmlAttribute(AttributeName="xmlns")]
	public string Xmlns { get; set; }
	[XmlAttribute(AttributeName="space", Namespace="http://www.w3.org/XML/1998/namespace")]
	public string Space { get; set; }
}





然后将你的XML反序列化为C#对象你要做的事情





Then to deserialize your XML to C# objects you'd do

var stream = new MemoryStream();
           var writer = new StreamWriter(stream);
           writer.Write(xml);
           writer.Flush();
           stream.Position = 0;

           var reader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
           var myXmlObject = new XmlSerializer(typeof(Xfdf)).Deserialize(reader) as Xfdf;







因此,一旦你对代码进行了反序列化,就可以像所以






So once you've desrialized your code, you can loop over it like so

foreach (var item in myXmlObject.Fields.Field)
            {
                Console.WriteLine("Field Name {0} - Field Value {1}", item.Name, item.Value);
            }







哪个提供输出






Which provides the output

Quote:

字段名称公司名称 - 字段值ABC

字段名称公司地址 - 字段价值芝加哥

字段名称公司电话 - 字段值123-456-7894

字段名称ACSysHP_ASHP_135k_240k_MeasureID - 字段值2635

Field Name Company Name - Field Value ABC
Field Name Company Address - Field Value Chicago
Field Name Company phone - Field Value 123-456-7894
Field Name ACSysHP_ASHP_135k_240k_MeasureID - Field Value 2635



< br $>


编辑:



改变XML以支持新的字段/属性名称








Altered XML to support new field/property names

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
	<fields>
		<field>
			<CompanyName>ABC</CompanyName>
			<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
			<CompanyAddress>ABC</CompanyAddress>
		</field>
		<field>
			<CompanyName>ABC</CompanyName>
			<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
			<CompanyAddress>ABC</CompanyAddress>
		</field>
		<field>
			<CompanyName>ABC</CompanyName>
			<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
			<CompanyAddress>ABC</CompanyAddress>
		</field>
		<field>
			<CompanyName>ABC</CompanyName>
			<CompanyPhoneNumber>ABC</CompanyPhoneNumber>
			<CompanyAddress>ABC</CompanyAddress>
		</field>
	</fields>
</xfdf>





改变字段类序列化





Altered Field class for serialization

[XmlRoot(ElementName="field", Namespace="http://ns.adobe.com/xfdf/")]
public class Field {
	[XmlElement(ElementName="CompanyName", Namespace="http://ns.adobe.com/xfdf/")]
	public string CompanyName { get; set; }
	[XmlElement(ElementName="CompanyPhoneNumber", Namespace="http://ns.adobe.com/xfdf/")]
	public string CompanyPhoneNumber { get; set; }
	[XmlElement(ElementName="CompanyAddress", Namespace="http://ns.adobe.com/xfdf/")]
	public string CompanyAddress { get; set; }
}





这将允许你做什么





Which would then allow you to do

foreach (var item in myXmlObject.Fields.Field)
{
	Console.WriteLine("CompanyName: {0}", item.CompanyName);
	Console.WriteLine("CompanyAddress: {0}", item.CompanyAddress);
	Console.WriteLine("CompanyPhoneNumber: {0}", item.CompanyPhoneNumber);
}


这篇关于如何将XML数据解析为C#对象属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆