xml序列化 - 如何在子节点中添加命名空间?

时间:2015-04-20 23:03:25

标签: 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>

我创建了一个类:

[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。我应该如何在子节点中包含命名空间?

1 个答案:

答案 0 :(得分:2)

你的方法有点不对劲。希望这完全解决了您的问题,但是这将有助于至少使您的结构正确。

您的SubNode课程分别为NameValue。如果查看XML,<SubNode>不包含这些属性/元素。这是你的<setting>节点。要解决此问题,您需要创建SubNodesetting类。

[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; }
}

请注意NamespaceXmlElementAttribute属性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);
    }
}