【问题标题】:XML Deserialization Diffrent Objects C#XML反序列化不同对象C#
【发布时间】:2020-09-03 20:13:12
【问题描述】:

也许有人可以给我一个提示来处理特定情况。我有一个无法更改的 XML,如下所示:

<?xml version = "1.0" encoding = "ISO-8859-1"?>
<bde>
    <Host name="172.16.25" port="1234"/>
    <Datafile name="bde-%d-%s.txt"/>
    <Linien>
        <Linie id="2,3,4,6,7,10,12">
            <Parameter name="a"/>
            <Parameter name="b"/>
            <Parameter name="c"/>
            <Parameter name="d"/>
            <Parameter name="e"/>
            <Parameter name="f"/>
            <Parameter name="g"/>
            <Parameter name="h"/>
            <Parameter name="i"/>
            <Parameter name="j"/>
            <Parameter name="k"/>
            <Parameter name="l"/>
        </Linie>
        <Linie id="1,11">
            <Parameter name="a"/>
            <Parameter name="n"/>
        </Linie>
        <Linie id="5">
            <Parameter name="a"/>
            <Parameter name="b"/>
            <Parameter name="n"/>
            <Parameter name="ö"/>
            <Parameter name="z"/>
            <Parameter name="e"/>
            <Parameter name="r"/>
            <Parameter name="z"/>
        </Linie>
        <Linie id="8">
            <Parameter name="a"/>
        </Linie>
        <Linie id="9">
            <Parameter name="a"/>
            <Parameter name="p"/>
            <Parameter name="z"/>
            <Parameter name="y"/>
            <Parameter name="q"/>
            <Parameter name="oi"/>
            <Parameter name="c"/>
            <Parameter name="k"/>
            <Parameter name="b"/>
        </Linie>
    </Linien>
</bde>

现在我必须将“Linien”序列化为对象,但它们具有不同的参数计数。 是否可以在 C# 中像这样读取这个 XML?

最好的问候, 亨德里克

【问题讨论】:

  • 为什么不用List?
  • 我试过了,但不知何故我的列表一直是空的 :( 问题是我有例如 linie 2 & 3& 4 & 5 .. 它们都必须是对象的类型:/

标签: c# xml object tags deserialization


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication166
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(BDE));
            BDE bde = (BDE)serializer.Deserialize(reader);
        }
    }
    [XmlRoot("bde")]
    public class BDE
    {
        public Host Host { get; set; }
        public Datafile Datafile { get; set; }
        [XmlArray(ElementName = "Linien")]
        [XmlArrayItem(ElementName = "Linie")]
        public List<Linie> Linie { get; set; }
    }
    public class Host
    {
        [XmlAttribute()]
        public string name { get; set; }
        [XmlAttribute()]
        public string port { get; set; }
    }
    public class Datafile
    {
        [XmlAttribute()]
        public string name { get; set; }
    }
    public class Linie
    {
        [XmlAttribute()]
        public string id { get; set; }
        [XmlElement()]
        public List<Parameter> Parameter { get; set; }
    }
    public class Parameter
    {
        [XmlAttribute()]
        public string name { get; set; }
    }

 
 
}

【讨论】:

  • 这非常适合获取所有对象,非常感谢,但现在缺少的是“ID”,例如,ID 为 2、3、4、6、7 的 bde 是bde[0]。我要存档的最终结果是,ID(什么是 bde 对象)连接到所有正确的参数:)
  • 太好了,对我帮助很大!谢谢
【解决方案2】:

如果我没记错的话,您想将您的 XML 转换为 C# 数据结构。如果是这样,这是可能的,并且有一些库可以帮助您。

就我个人而言,我会创建一个 Linie 和 Linien 类,其中 Linien 类具有一个 Linie 对象向量(因此每个 Linien 对象支持不同数量的 Linie)

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多