如何将XML文件转换为C#对象?

huangapple go评论98阅读模式
英文:

How to convert xml file to C# object?

问题

我正在尝试将这个 XML 文件转换为 C# 对象,但是不起作用。我无法获取 Group 标签之间的文本。类的结构允许我获取 Group 标签内部的子元素,但是当 Group 标签内只有一个文本时,我无法选择它。

以下是 XML 结构和我的类:

XML 文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Main>
  3. <Group>
  4. <NV>BasicPars</NV>
  5. <Property>
  6. <NV>Name</NV>
  7. <Value>wzorzec</Value>
  8. </Property>
  9. <Property>
  10. <NV>UseFixedSizes</NV>
  11. <Value>False</Value>
  12. </Property>
  13. </Group>
  14. <Group>EventPars</Group>
  15. <Group>Registers</Group>
  16. </Main>

我的类:

  1. [XmlRoot(ElementName="Property")]
  2. public class Property {
  3. [XmlElement(ElementName="NV")]
  4. public string NV { get; set; }
  5. [XmlElement(ElementName="Value")]
  6. public string Value { get; set; }
  7. }
  8. [XmlRoot(ElementName="Group")]
  9. public class Group {
  10. [XmlElement(ElementName="NV")]
  11. public string NV { get; set; }
  12. [XmlElement(ElementName="Property")]
  13. public List<Property> Property { get; set; }
  14. }
  15. [XmlRoot(ElementName="Main")]
  16. public class Main {
  17. [XmlElement(ElementName="Group")]
  18. public List<Group> Group { get; set; }
  19. }
英文:

I'm trying to convert this xml file to C# object but it doesn't work. I can't to get text between Group tags. The classes structure let me to get childs inside Group tag, but when Group tag has just one text inside, I can't select it.

I give the XML structure and my classes.

XML file:

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
  2. &lt;Main&gt;
  3. &lt;Group&gt;
  4. &lt;NV&gt;BasicPars&lt;/NV&gt;
  5. &lt;Property&gt;
  6. &lt;NV&gt;Name&lt;/NV&gt;
  7. &lt;Value&gt;wzorzec&lt;/Value&gt;
  8. &lt;/Property&gt;
  9. &lt;Property&gt;
  10. &lt;NV&gt;UseFixedSizes&lt;/NV&gt;
  11. &lt;Value&gt;False&lt;/Value&gt;
  12. &lt;/Property&gt;
  13. &lt;/Group&gt;
  14. &lt;Group&gt;EventPars&lt;/Group&gt;
  15. &lt;Group&gt;Registers&lt;/Group&gt;
  16. &lt;/Main&gt;

My classes:

  1. [XmlRoot(ElementName=&quot;Property&quot;)]
  2. public class Property {
  3. [XmlElement(ElementName=&quot;NV&quot;)]
  4. public string NV { get; set; }
  5. [XmlElement(ElementName=&quot;Value&quot;)]
  6. public string Value { get; set; }
  7. }
  8. [XmlRoot(ElementName=&quot;Group&quot;)]
  9. public class Group {
  10. [XmlElement(ElementName=&quot;NV&quot;)]
  11. public string NV { get; set; }
  12. [XmlElement(ElementName=&quot;Property&quot;)]
  13. public List&lt;Property&gt; Property { get; set; }
  14. }
  15. [XmlRoot(ElementName=&quot;Main&quot;)]
  16. public class Main {
  17. [XmlElement(ElementName=&quot;Group&quot;)]
  18. public List&lt;Group&gt; Group { get; set; }
  19. }

答案1

得分: 3

首先,只需要在根对象(即Main)上使用XmlRoot。从其他对象中删除它。

为了捕获元素内部的文本,可以使用[XmlText](参考链接:https://learn.microsoft.com/en-us/dotnet/standard/serialization/attributes-that-control-xml-serialization)。

修正后的类如下:

  1. public class Property {
  2. [XmlElement(ElementName="NV")]
  3. public string NV { get; set; }
  4. [XmlElement(ElementName="Value")]
  5. public string Value { get; set; }
  6. }
  7. public class Group {
  8. [XmlElement(ElementName="NV")]
  9. public string NV { get; set; }
  10. [XmlElement(ElementName="Property")]
  11. public List<Property> Property { get; set; }
  12. [XmlText]
  13. public string InnerText { get; set; }
  14. }
  15. [XmlRoot(ElementName="Main")]
  16. public class Main {
  17. [XmlElement(ElementName="Group")]
  18. public List<Group> Group { get; set; }
  19. }

这样可以正确进行反序列化(参考链接:https://dotnetfiddle.net/RrBTfC)。

英文:

First, you only need XmlRoot on the root object (that is, Main). Remove it from the others.

In order to capture the text inside an element, use [XmlText].

The fixed classes are:

  1. public class Property {
  2. [XmlElement(ElementName=&quot;NV&quot;)]
  3. public string NV { get; set; }
  4. [XmlElement(ElementName=&quot;Value&quot;)]
  5. public string Value { get; set; }
  6. }
  7. public class Group {
  8. [XmlElement(ElementName=&quot;NV&quot;)]
  9. public string NV { get; set; }
  10. [XmlElement(ElementName=&quot;Property&quot;)]
  11. public List&lt;Property&gt; Property { get; set; }
  12. [XmlText]
  13. public string InnerText { get; set; }
  14. }
  15. [XmlRoot(ElementName=&quot;Main&quot;)]
  16. public class Main {
  17. [XmlElement(ElementName=&quot;Group&quot;)]
  18. public List&lt;Group&gt; Group { get; set; }
  19. }

Which deserializes correctly.

答案2

得分: 0

public class Serializer
{
public T Deserialize(string input) where T : class
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

  1. using (StringReader sr = new StringReader(input))
  2. {
  3. return (T)ser.Deserialize(sr);
  4. }
  5. }
  6. public string Serialize<T>(T ObjectToSerialize)
  7. {
  8. XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());
  9. using (StringWriter textWriter = new StringWriter())
  10. {
  11. xmlSerializer.Serialize(textWriter, ObjectToSerialize);
  12. return textWriter.ToString();
  13. }
  14. }

}

英文:
  1. public class Serializer
  2. {
  3. public T Deserialize&lt;T&gt;(string input) where T : class
  4. {
  5. System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
  6. using (StringReader sr = new StringReader(input))
  7. {
  8. return (T)ser.Deserialize(sr);
  9. }
  10. }
  11. public string Serialize&lt;T&gt;(T ObjectToSerialize)
  12. {
  13. XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());
  14. using (StringWriter textWriter = new StringWriter())
  15. {
  16. xmlSerializer.Serialize(textWriter, ObjectToSerialize);
  17. return textWriter.ToString();
  18. }
  19. }
  20. }

huangapple
  • 本文由 发表于 2023年7月27日 15:10:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/76777271.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定