C# xml序列化-如何在子节点中添加名称空间?
我正在尝试序列化如下所示的xml文件:C# xml序列化-如何在子节点中添加名称空间?,c#,xml,C#,Xml,我正在尝试序列化如下所示的xml文件: <?xml version="1.0" encoding="utf-8" ?> <MainNode xmlns="http://test"> <SubNode xmlns:xsi="http://test2" xmlns="test3"> <setting name = "1" value = "2"/> </SubNode> </MainNode> 反序列化失败,因
<?xml version="1.0" encoding="utf-8" ?>
<MainNode xmlns="http://test">
<SubNode xmlns:xsi="http://test2" xmlns="test3">
<setting name = "1" value = "2"/>
</SubNode>
</MainNode>
反序列化失败,因为我的子节点中有xmlns:xsi和xlms。我应该如何在我的子节点中包含名称空间?您的方法有点错误。希望这能完全解决您的问题,但这至少有助于使您的结构正确 您有一个
子节点
类,它具有名称
和值
。如果查看XML,您的
不包含这些属性/元素。是您的
节点执行此操作。要解决此问题,您需要创建子节点
和设置
类
[XmlRoot(Namespace="http://test")]
public class MainNode
{
[XmlElement(Namespace="test3")]
public SubNode SubNode { get; set; }
}
public class SubNode
{
[XmlElement("setting")]
public SettingsNode Settings { get; set; }
}
public class SettingsNode
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
}
注意属性子节点
上的xmlementattribute
上设置的名称空间
。这将强制所有子级(除非特别重写)它属于该命名空间
我认为您不必担心xsi
属性,但如果您这样做,我相信您将需要查看。这至少能让你得到正确的结构
编辑:刚刚测试并做了一个小的修正。这似乎很好地反序列化了示例XML。以下是我的小测试:
void Main()
{
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<MainNode xmlns=""http://test"">
<SubNode xmlns:xsi=""http://test2"" xmlns=""test3"">
<setting name = ""1"" value = ""2""/>
</SubNode>
</MainNode>";
var serializer = new XmlSerializer(typeof(MainNode));
using (TextReader reader = new StringReader(xml))
{
var result = (MainNode)serializer.Deserialize(reader);
Console.WriteLine(result.SubNode.Settings.Value);
}
}
void Main()
{
字符串xml=@“
";
var serializer=新的XmlSerializer(typeof(MainNode));
使用(TextReader=new StringReader(xml))
{
var result=(主节点)序列化程序。反序列化(读取器);
Console.WriteLine(result.SubNode.Settings.Value);
}
}
void Main()
{
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<MainNode xmlns=""http://test"">
<SubNode xmlns:xsi=""http://test2"" xmlns=""test3"">
<setting name = ""1"" value = ""2""/>
</SubNode>
</MainNode>";
var serializer = new XmlSerializer(typeof(MainNode));
using (TextReader reader = new StringReader(xml))
{
var result = (MainNode)serializer.Deserialize(reader);
Console.WriteLine(result.SubNode.Settings.Value);
}
}