gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:59:16 36 4
gpt4 key购买 nike

我有一个使用自定义部分进行配置的 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com