我正在尝试序列化一个如下所示的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>
我创建了一个类:
[XmlRootAttribute(Namespace = "test")]
public class MainNode
{
[XmlElement("SubNode")]
public SubNode SubNode { get; set; }
}
public class SubNode
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("value")]
public string Value { get; set; }
}
反序列化失败,因为我的子节点中有xmlns:xsi和xlms。我应该如何在子节点中包含命名空间?
答案 0 :(得分:2)
你的方法有点不对劲。希望这完全解决了您的问题,但是这将有助于至少使您的结构正确。
您的SubNode
课程分别为Name
和Value
。如果查看XML,<SubNode>
不包含这些属性/元素。这是你的<setting>
节点。要解决此问题,您需要创建SubNode
和setting
类。
[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; }
}
请注意Namespace
在XmlElementAttribute
属性SubNode
上的设置。这应该强制所有孩子(除非特别重写)它是该命名空间。
我不一定认为您需要担心xsi
属性,但如果您这样做,我相信您需要查看XmlNamespaceDeclarationsAttribute。这至少应该为您提供正确的结构。
编辑:刚刚测试并进行了小幅修正。这似乎可以很好地反序列化您的示例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);
}
}