Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML字符串反序列化为复杂类型_C#_Xml_Deserialization - Fatal编程技术网

C# 将XML字符串反序列化为复杂类型

C# 将XML字符串反序列化为复杂类型,c#,xml,deserialization,C#,Xml,Deserialization,我的Xml(我无法更改): 反序列化此XML的工作与预期的一样,但我想将Country属性更改为复杂类型,如下所示: public Country Country { get; set; } 然后在country.name属性中输入国家名称“JAPAN”,有什么想法吗?您可以用如下属性装饰country类的name属性: [XmlRoot("result")] public class VehicleDetails { public string Type { get; set; }

我的Xml(我无法更改):

反序列化此XML的工作与预期的一样,但我想将
Country
属性更改为复杂类型,如下所示:

public Country Country { get; set; }

然后在
country.name
属性中输入国家名称“JAPAN”,有什么想法吗?

您可以用如下属性装饰
country
类的
name
属性:

[XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public Country Country { get; set; }
}

public class Country
{
    [XmlText]
    public string Name { get; set; }
}
还要注意,我已经去掉了
[Serializable]
属性。它对于XML序列化是无用的。此属性用于二进制/远程序列化

下面是一个完整的示例,将按预期打印
JAPAN

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

[XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public Country Country { get; set; }
}

public class Country
{
    [XmlText]
    public string Name { get; set; }
}

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(VehicleDetails));
        var xml = 
        @"<result>
            <Type>MAZDA</Type>
            <Make>RX-8</Make>
            <Country>JAPAN</Country>
        </result>";
        using (var reader = new StringReader(xml))
        using (var xmlReader = XmlReader.Create(reader))
        {
            var result = (VehicleDetails)serializer.Deserialize(xmlReader);
            Console.WriteLine(result.Country.Name);
        }
    }
}
使用系统;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
[XmlRoot(“结果”)]
公营车辆详情
{
公共字符串类型{get;set;}
公共字符串Make{get;set;}
公共国家{get;set;}
}
公营国家
{
[XmlText]
公共字符串名称{get;set;}
}
班级计划
{
静态void Main()
{
var serializer=新的XmlSerializer(typeof(VehicleDetails));
变量xml=
@"
马自达
RX-8
日本
";
使用(var reader=newstringreader(xml))
使用(var xmlReader=xmlReader.Create(reader))
{
var result=(VehicleDetails)序列化程序。反序列化(xmlReader);
Console.WriteLine(result.Country.Name);
}
}
}

这是VB 2010的等价物

Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

Public Module Module1

    Public Sub Main()
        Dim serializer = New XmlSerializer(GetType(VehicleDetails))
        Dim xml = "<result>             <Type>MAZDA</Type>             <Make>RX-8</Make>             <Country>JAPAN</Country>         </result>"

        Using reader = New StringReader(xml)
            Using xmlReader__1 = XmlReader.Create(reader)
                Dim result = DirectCast(serializer.Deserialize(xmlReader__1), VehicleDetails)
                Console.WriteLine(result.Country.Name)
            End Using
        End Using
    End Sub

    <XmlRoot("result")> _
    Public Class VehicleDetails

        Public Property Type() As String
            Get
                Return m_Type
            End Get
            Set(value As String)
                m_Type = value
            End Set
        End Property
        Private m_Type As String


        Public Property Make() As String
            Get
                Return m_Make
            End Get
            Set(value As String)
                m_Make = value
            End Set
        End Property
        Private m_Make As String
        Public Property Country() As Country
            Get
                Return m_Country
            End Get
            Set(value As Country)
                m_Country = value
            End Set
        End Property
        Private m_Country As Country

    End Class
    Public Class Country
        <XmlText()> _
        Public Property Name() As String
            Get
                Return m_Name
            End Get
            Set(value As String)
                m_Name = value
            End Set
        End Property
        Private m_Name As String
    End Class

End Module
Imports System.IO
导入System.Xml
导入System.Xml.Xml
公共模块模块1
公用分干管()
Dim serializer=新的XmlSerializer(GetType(VehicleDetails))
Dim xml=“马自达RX-8日本”
使用阅读器=新的StringReader(xml)
使用xmlReader__1=xmlReader.Create(reader)
Dim结果=DirectCast(序列化程序.反序列化(xmlReader__1),车辆详细信息)
Console.WriteLine(result.Country.Name)
终端使用
终端使用
端接头
_
公营车辆详情
作为字符串的公共属性类型()
得到
返回m_类型
结束
设置(值为字符串)
m_类型=值
端集
端属性
私有m_类型为字符串
公共属性Make()作为字符串
得到
退货
结束
设置(值为字符串)
m_Make=价值
端集
端属性
私人m_Make As String
公共财产国()作为国家
得到
返回m_国家
结束
设置(值为国家/地区)
m_国家=价值
端集
端属性
作为国家的私人m_国家
末级
公营国家
_
作为字符串的公共属性名()
得到
返回m_名称
结束
设置(值为字符串)
m_Name=值
端集
端属性
私有m_名称作为字符串
末级
端模块

谢谢Darin,效果很好。我可以将两个XML节点聚合为一个复杂类型吗?e、 g.
0error
,将这两个属性合并为一个
public Error Error{get;set;}
属性,其中类型
Error
有两个属性,
code
message
?问题是,我希望能够动态地完成这项工作,而不是将所有事情都硬编码。希望能够调用一个以XML对象作为参数的函数,并让它返回一个对象,或者让XML对象本身像我们所拥有的那样是可寻址的。如果无法从运行时发现的字符串中创建属性,则无法使用此函数..:(
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("result")]
public class VehicleDetails
{
    public string Type { get; set; }
    public string Make { get; set; }
    public Country Country { get; set; }
}

public class Country
{
    [XmlText]
    public string Name { get; set; }
}

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(VehicleDetails));
        var xml = 
        @"<result>
            <Type>MAZDA</Type>
            <Make>RX-8</Make>
            <Country>JAPAN</Country>
        </result>";
        using (var reader = new StringReader(xml))
        using (var xmlReader = XmlReader.Create(reader))
        {
            var result = (VehicleDetails)serializer.Deserialize(xmlReader);
            Console.WriteLine(result.Country.Name);
        }
    }
}
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

Public Module Module1

    Public Sub Main()
        Dim serializer = New XmlSerializer(GetType(VehicleDetails))
        Dim xml = "<result>             <Type>MAZDA</Type>             <Make>RX-8</Make>             <Country>JAPAN</Country>         </result>"

        Using reader = New StringReader(xml)
            Using xmlReader__1 = XmlReader.Create(reader)
                Dim result = DirectCast(serializer.Deserialize(xmlReader__1), VehicleDetails)
                Console.WriteLine(result.Country.Name)
            End Using
        End Using
    End Sub

    <XmlRoot("result")> _
    Public Class VehicleDetails

        Public Property Type() As String
            Get
                Return m_Type
            End Get
            Set(value As String)
                m_Type = value
            End Set
        End Property
        Private m_Type As String


        Public Property Make() As String
            Get
                Return m_Make
            End Get
            Set(value As String)
                m_Make = value
            End Set
        End Property
        Private m_Make As String
        Public Property Country() As Country
            Get
                Return m_Country
            End Get
            Set(value As Country)
                m_Country = value
            End Set
        End Property
        Private m_Country As Country

    End Class
    Public Class Country
        <XmlText()> _
        Public Property Name() As String
            Get
                Return m_Name
            End Get
            Set(value As String)
                m_Name = value
            End Set
        End Property
        Private m_Name As String
    End Class

End Module