Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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 - Fatal编程技术网

C# 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文件:

<?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);
    }
}