c# - 无法在 C# 中反序列化 XML - 未识别的元素 'add'

标签 c# xml

我有一个使用自定义部分进行配置的 C# 应用程序。我将那部分 XML 定义为字符串。字符串看起来像这样:

var xml = @"<departments>
  <department id=""1"" name=""Sporting Goods"">
    <products>
      <product name=""Basketball"" price=""9.99"">
        <add key=""Color"" value=""Orange"" />
        <add key=""Brand"" value=""[BrandName]"" />
      </product>
    </products>
  </department>
</departments>"; 

此 XML 与我描述的类定义的模式相匹配 here .当我将上述字符串传递给 Departments.Deserialize 方法时,我收到一个错误。错误显示:“无法识别的元素‘添加’”。调试器跳转到我的 Departments 类中的这一行。

public void ReadXml(XmlReader reader)
{
  this.DeserializeElement(reader, false);
}

我假设错误是指“product”元素中的“add”元素。但是,Product ConfigurationElement 有一个名为 KeyValueConfigurationCollection Items 的属性。因此,add 似乎可行。

为什么我会收到此错误?如何修复我的代码,以便反序列化上面显示的 XML 字符串?

最佳答案

更新:长话短说 - 错误的序列化程序。

除了特定的反序列化方法外,大部分代码都有效。

我能够纠正原始解决方案( here 是我找到灵感的地方)。

我已更正并有效的部分(不要忘记原始 post 中的 IXmlSerializable):

private static string sectionName = "departments";

public static Departments Deserialize(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Departments), new XmlRootAttribute(sectionName));
        Departments departments = null;

        var xdoc = XDocument.Parse(xml);
        departments = (Departments)serializer.Deserialize(xdoc.CreateReader());

        //var serializer = new XmlSerializer(typeof(Departments));
        //using (var reader = new StringReader(xml))
        //{
        //    departments = (Departments)(serializer.Deserialize(reader));
        //}

        return departments;
    }

希望它能帮助您继续前进。至少可以在我的机器上运行。如果需要完整的代码 list ,请告诉我。

[保留原始解决方案,简单阅读建议的有问题的 xml block ]

  • 测试客户端。

class Program
{
    static void Main(string[] args)
    {
        string str = @"<departments>
                          <department id = ""1"" name = ""Sporting Goods"">
                               <products>
                                 <product name=""Basketball"" price=""9.99"">
                                      <add key = ""Color"" value = ""Orange""/>
                                      <add key = ""Brand"" value = ""[BrandName]""/>
                                 </product>
                               </products>
                          </department>
                       </departments>";

        XmlDocument xmlDoc = LoadXmlsFromString(str);

        string productXpath = "descendant-or-self::product";
        var nodes = ExtractNodes(xmlDoc, productXpath);
        foreach (XmlNode childrenNode in nodes)
        {
            var node = childrenNode.SelectSingleNode("descendant-or-self::*")?.OuterXml;
            var obj = Product.Deserialize(node);
        }
    }

    private static XmlNodeList ExtractNodes(XmlDocument xmlDoc, string xpath)
    {
        var nodes = xmlDoc.SelectNodes(xpath);
        return nodes;
    }

    private static XmlDocument LoadXmlsFromString(string str)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(str);
        return xmlDoc;
    }
}
  • 通过为添加元素列表(以及要转换成的元素对象)添加 [XmlElement("add")] 属性来实现读取产品。

[Serializable, XmlRoot("add")]
public class KeyValue
{
    [XmlAttribute(AttributeName = "key")]
    public string Key { get; set; }
    [XmlAttribute(AttributeName = "value")]
    public string Value { get; set; }

    public static KeyValue Deserialize(string xml)
    {
        KeyValue keyValue = null;
        var serializer = new XmlSerializer(typeof(KeyValue));
        using (var reader = new StringReader(xml))
        {
            keyValue = (KeyValue)(serializer.Deserialize(reader));
        }
        return keyValue;
    }
}

[Serializable, XmlRoot("product")]
public class Product
{
    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName = "price")]
    public decimal Price { get; set; }
    [XmlElement("add")]
    public List<KeyValue> KeyValueList { get; set; }

    public static Product Deserialize(string xml)
    {
        Product product = null;
        var serializer = new XmlSerializer(typeof(Product));
        using (var reader = new StringReader(xml))
        {
            product = (Product)(serializer.Deserialize(reader));
        }

        return product;
    }
}

关于c# - 无法在 C# 中反序列化 XML - 未识别的元素 'add',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51252299/

相关文章:

c# - 如何将此 javascript 行转换为 c#?

c# - 如何将 List<String> 转换为 xml 文档?

java - 在 Java 中使用 JAXB 序列化树结构

c# - 如何从 XDocument 获取文本值?

c# - 如何创建多个 1 :1 foreign key relationships in Entity Framework 6 Code First?

c# - 什么决定了最大纹理尺寸?

java - 使用 JAXB 将 XML 转换为 Java 对象时删除额外的嵌套

java - JSON 和 XML 不匹配

c# - 本地数据库,我需要一些例子

c# - 在 WPF 的主窗口上绘画