如何将XML数据解析为C#对象属性 [英] How to parse XML data into C# object properties
问题描述
我有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
字段名称公司名称 - 字段值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屋!