C#xml序列化结构更改

问题描述 投票:0回答:1

我在了解如何最好地捕获正确的xml节并将序列化的数据以正确的格式保存到db时遇到问题?

通常,我将从api获得单个结果,到目前为止,关于序列化和反序列化,一切都很好:样本xml:

<?xml version="1.0" encoding="UTF-8" ?>
<itemsApi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <itemDatas>
        <itemData itemId="1233456789" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
</itemsApi>

用于序列化/反序列化的单个项目上的代码如下:

public class XmlSerializationManager<T>
    {
        private readonly Type _type;


        public XmlSerializationManager()
        {
            _type = typeof(T);
        }

        public void Save(string path, object obj)
        {
            using (TextWriter textWriter = new StreamWriter(path))
            {
                var serializer = new XmlSerializer(_type);
                serializer.Serialize(textWriter, obj);
                textWriter.Close();
            }
        }

        public T Read(string fileContent)
        {
            T result;
            using (TextReader textReader = new StringReader(fileContent))
            {
                var serializer = new XmlSerializer(_type);
                result = (T)serializer.Deserialize(textReader);
            }

            return result;
        }
    }

此单个项目反序列化和序列化就很好了,但是为了检查项目是否已更新,我提供了一个更新ID,该ID返回一个项目列表,其中包含所有已收到价格或产品详细信息更改的项目,例如以下示例:

<?xml version="1.0" encoding="UTF-8" ?>
<itemsApi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <itemDatas>
        <itemData itemId="1233456789" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
    <itemDatas>
        <itemData itemId="34523452345" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
    <itemDatas>
        <itemData itemId="456754675467" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
    <itemDatas>
        <itemData itemId="2345567898907" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
    <itemDatas>
        <itemData itemId="098721354" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
            <node1>Sample</node1>
            <node2>Sample</node2>
            <node3>
                <childNode1>Sample</childNode1>
                <childNode2>Sample</childNode2>
            </node3>
        </itemData>
    </itemDatas>
</itemsApi>

我看到的问题是当我以foreach itemdatas的形式在列表上工作时,从xsd生成的架构类在保存到数据库时会导致xml节点名称的级联格式:

Schema类摘要:-

/// <remarks />
[GeneratedCode("xsd", "4.6.1590.0")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class itemsApiProgramMappings
{
    private itemsApiItemDatasItemData[] itemDataField;

    private string typeField;

    /// <remarks />
    [XmlElement("itemData")]
    public itemsApiItemDatasItemData[] itemData
    {
        get => itemDataField;
        set => itemDataField = value;
    }

    /// <remarks />
    [XmlAttribute]
    public string type
    {
        get => typeField;
        set => typeField = value;
    }
}

这会导致序列化的数据在保存到db时看起来如下所示,可以看到列表项的节点名称按照架构类进行了串联,但这是有问题的。

<?xml version="1.0" encoding="UTF-8" ?>
<itemsApiItemDatasItemData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"itemId="1233456789" itemAdded="2020-04-26T17:13:06Z" itemUpdateId="123456789">
    <node1>Sample</node1>
    <node2>Sample</node2>
    <node3>
        <childNode1>Sample</childNode1>
        <childNode2>Sample</childNode2>
    </node3>
</itemsApiItemDatasItemData>

想实现的是保存到数据库时保持单一结果格式的结构,目前从架构类返回的结构在以后检索存储的数据并尝试反序列化时导致我出错,我认为目前,我真的对解决方案视而不见。

希望我已经很好地解释了这一点,并相信有人可以在我的兔子洞里塞进一点东西时突出我的方式的错误。

c#
1个回答
0
投票

您将模式数据整体序列化我认为它正在使用这种类型的名称公共itemsApiItemDatasItemData [] itemData

您可以尝试执行类似的操作

public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

或参考此documentation以获取更多信息

© www.soinside.com 2019 - 2024. All rights reserved.