gpt4 book ai didi

c# - 反序列化只有一个节点的 XML 文件时出现问题;根节点

转载 作者:行者123 更新时间:2023-11-30 22:33:15 25 4
gpt4 key购买 nike

这是我要反序列化的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<d:MyItem xmlns:d="http://someurl" xmlns:m="http://someotherurl">This is a string</d:MyItem>

xsd tool生成了以下类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://someurl")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://someurl", IsNullable=false)]
public partial class MyItem {

private object[] itemsField;

/// <remarks/>
public object[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}

我目前正在尝试反序列化与 xsd 相同的 xml用于生成类:

var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<d:MyItem xmlns:d=\"http://someurl\" xmlns:m=\"http://someotherurl\">This is a string</d:MyItem>";
var deserialized = Deserialize<MyItem>(xml);

在哪里Deserialize<>是:

private static T Deserialize<T>(string xml)
{
var xmlDocument = XDocument.Parse(xml);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
return (T)serializer.Deserialize(xmlDocument.CreateReader());
}

问题是虽然Deserialize返回一个实例(非空),Items它里面的属性是null即它没有被反序列化。

我怎样才能从这个 XML 中获取字符串?

最佳答案

XSD.exe 期望您的根文档元素是复杂类型,但在您的情况下它是一个简单的字符串,因此 XSD.exe 中的各种假设会导致问题。它生成的错误模式只是几个问题中的第一个。

最简单的解决方案是忽略 XSD.exe,只创建您自己的 XML 可序列化类:

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://someurl")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://someurl", IsNullable = false)]
public partial class MyItem
{
[System.Xml.Serialization.XmlTextAttribute]
public string Value { get; set; }
}

此外,我不确定您为什么在反序列化中使用 XDocument.Parse。你可以这样简化它:

private static T Deserialize<T>(string xml)
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
return (T)serializer.Deserialize(new StringReader(xml));
}

这是完整的工作代码:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://someurl")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://someurl", IsNullable = false)]
public partial class MyItem
{
[System.Xml.Serialization.XmlTextAttribute]
public string Value { get; set; }
}

class Program
{
static void Main(string[] args)
{
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<d:MyItem xmlns:d=\"http://someurl\" xmlns:m=\"http://someotherurl\">This is a string</d:MyItem>";
var deserialized = Deserialize<MyItem>(xml);
// Result: deserialized.Value == "This is a string"
}

private static T Deserialize<T>(string xml) where T : new()
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
return (T)serializer.Deserialize(new StringReader(xml));
}
}
}

关于c# - 反序列化只有一个节点的 XML 文件时出现问题;根节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403124/

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