导入具有非典型格式的XML到一个类中

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

Import XML with a non typical format to a class

问题

我需要导入一个看起来像这样的XML文件:

  1. <Carpark>
  2. <Trucks>
  3. <Truck brand='Chrysler' kg='2100'/>
  4. </Trucks>
  5. <Cars>
  6. <Car brand='Mercedes' kg='1100'/>
  7. </Cars>
  8. <Tractors>
  9. <Tractor brand='John Deere' kg='1500'/>
  10. </Tractors>
  11. </Carpark>

基本上,我想要有一个这样的Carpark列表:

  1. public class Carpark
  2. {
  3. // Type can be for example Truck, Car
  4. public string Type { get; set; }
  5. public string Brand { get; set; }
  6. public int Weight { get; set; }
  7. }

我不明白如何将这个XML文件转换成我想要的类。

我尝试过:

  1. XElement xElement = XElement.Load(filePath);
  2. IEnumerable<Carpark> carpark = xElement.Elements();
  3. foreach(var vehicle in carpark)
  4. {
  5. // 一旦我写出这行,我对接下来该怎么做感到困惑
  6. Console.WriteLine(vehicle.ToString());
  7. }
英文:

I need to import a XML file looking like this:

  1. <Carpark>
  2. <Trucks>
  3. <Truck brand='Chrysler' kg='2100'/>
  4. </Trucks>
  5. <Cars>
  6. <Car brand='Mercedes' kg='1100'/>
  7. </Cars>
  8. <Tractors>
  9. <Tractor brand='John Deere' kg='1500'/>
  10. </Tractors>
  11. </Carpark>

Essentially I want to have a list of Carpark like this:

  1. public class Carpark
  2. {
  3. // Type can be for example Truck, Car
  4. public string Type { get; set; }
  5. public string Brand { get; set; }
  6. public int Weight { get; set; }
  7. }

I don't understand how to convert this XML file to the class I want.

What I have tried is:

  1. XElement xElement = XElement.Load(filePath);
  2. IEnumerable<Carpark> carpark = xElement.Elements();
  3. foreach(var vehicle in carpark)
  4. {
  5. // Once I wrote out the line I was confused as to how to proceed
  6. Console.WriteLine(vehicle.ToString());
  7. }

答案1

得分: 1

以下是您要翻译的内容:

使用Linq_To_XML和我相信还可以使用NewtonsoftJSON来完成这个操作:

  1. void Main()
  2. {
  3. var xml = XElement.Parse(x)
  4. .DescendantsAndSelf("Carpark")
  5. .Descendants()
  6. .Where(xe => xe.HasAttributes)
  7. .Select(xe => new Carpark {
  8. Type = xe.Name.ToString(),
  9. Brand = (string)xe.Attribute("brand"),
  10. Weight = (int)xe.Attribute("kg")
  11. });
  12. foreach (var cp in xml)
  13. {
  14. Console.WriteLine($"{cp.Type}, {cp.Brand}, {cp.Weight}");
  15. }
  16. }
  17. static readonly string x = @"<Carpark>
  18. <Trucks>
  19. <Truck brand='Chrysler' kg='2100'/>
  20. </Trucks>
  21. <Cars>
  22. <Car brand='Mercedes' kg='1100'/>
  23. </Cars>
  24. <Tractors>
  25. <Tractor brand='John Deere' kg='1500'/>
  26. </Tractors>
  27. </Carpark>";
  28. public class Carpark
  29. {
  30. // Type can be for example Truck, Car
  31. public string Type { get; set; }
  32. public string Brand { get; set; }
  33. public int Weight { get; set; }
  34. }
英文:

You can do that with Linq_To_XML and I believe with NewtonsoftJSON:

  1. void Main()
  2. {
  3. var xml = XElement.Parse(x)
  4. .DescendantsAndSelf(&quot;Carpark&quot;)
  5. .Descendants()
  6. .Where(xe =&gt; xe.HasAttributes)
  7. .Select(xe =&gt; new Carpark {
  8. Type = xe.Name.ToString(),
  9. Brand = (string)xe.Attribute(&quot;brand&quot;),
  10. Weight = (int)xe.Attribute(&quot;kg&quot;)
  11. })
  12. ;
  13. foreach (var cp in xml)
  14. {
  15. Console.WriteLine($&quot;{cp.Type}, {cp.Brand}, {cp.Weight}&quot;);
  16. }
  17. }
  18. static readonly string x = @&quot;&lt;Carpark&gt;
  19. &lt;Trucks&gt;
  20. &lt;Truck brand=&#39;Chrysler&#39; kg=&#39;2100&#39;/&gt;
  21. &lt;/Trucks&gt;
  22. &lt;Cars&gt;
  23. &lt;Car brand=&#39;Mercedes&#39; kg=&#39;1100&#39;/&gt;
  24. &lt;/Cars&gt;
  25. &lt;Tractors&gt;
  26. &lt;Tractor brand=&#39;John Deere&#39; kg=&#39;1500&#39;/&gt;
  27. &lt;/Tractors&gt;
  28. &lt;/Carpark&gt;&quot;;
  29. public class Carpark
  30. {
  31. // Type can be for example Truck, Car
  32. public string Type { get; set; }
  33. public string Brand { get; set; }
  34. public int Weight { get; set; }
  35. }

答案2

得分: 0

你可以使用以下类来自动使用 XmlSerializer 进行反序列化:

  1. public class Carpark
  2. {
  3. public List<Truck> Trucks { get; set; }
  4. public List<Car> Cars { get; set; }
  5. public List<Tractor> Tractors { get; set; }
  6. }
  7. [XmlInclude(typeof(Truck))]
  8. [XmlInclude(typeof(Car))]
  9. [XmlInclude(typeof(Tractor))]
  10. public class Vehicle
  11. {
  12. [XmlIgnore]
  13. public string Type => this.GetType().Name;
  14. [XmlAttribute("brand")]
  15. public string Brand { get; set; }
  16. [XmlAttribute("kg")]
  17. public int Weight { get; set; }
  18. }
  19. public class Truck : Vehicle
  20. {
  21. }
  22. public class Car : Vehicle
  23. {
  24. }
  25. public class Tractor : Vehicle
  26. {
  27. }

然后,你可以使用以下代码来进行反序列化:

  1. var cp = (Carpark)serializer.Deserialize(someStreamReader);

如果需要更多帮助,请告诉我。

英文:

You can use the following classes to deserialize this with XmlSerializer automatically

  1. public class Carpark
  2. {
  3. public List&lt;Truck&gt; Trucks { get; set; }
  4. public List&lt;Car&gt; Cars { get; set; }
  5. public List&lt;Tractor&gt; Tractors { get; set; }
  6. }
  7. [XmlInclude(typeof(Truck))]
  8. [XmlInclude(typeof(Car))]
  9. [XmlInclude(typeof(Tractor))]
  10. public class Vehicle
  11. {
  12. [XmlIgnore]
  13. public string Type =&gt; this.GetType().Name;
  14. [XmlAttribute(&quot;brand&quot;)]
  15. public string Brand { get; set; }
  16. [XmlAttribute(&quot;kg&quot;)]
  17. public int Weight { get; set; }
  18. }
  19. public class Truck : Vehicle
  20. {
  21. }
  22. public class Car : Vehicle
  23. {
  24. }
  25. public class Tractor : Vehicle
  26. {
  27. }

  1. var cp = (Carpark)serializer.Deserialize(someStreamReader);

dotnetfiddle

huangapple
  • 本文由 发表于 2023年6月22日 00:46:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76525495.html
匿名

发表评论

匿名网友

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

确定