为什么 XmlTypeAttribute.Namespace 不为根元素设置命名空间?
Why does XmlTypeAttribute.Namespace not set a namespace for the root element?
我从 XSD 生成的类型如下所示:
[XmlType(Namespace = "http://example.com")]
public class Foo
{
public string Bar { get; set; }
}
像这样序列化时:
var stream = new MemoryStream();
new XmlSerializer(typeof(Foo)).Serialize(stream, new Foo() { Bar = "hello" });
var xml = Encoding.UTF8.GetString(stream.ToArray());
输出是这样的:
<?xml version="1.0"?>
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Bar xmlns="http://example.com">hello</Bar>
</Foo>
为什么根元素没有设置命名空间?当然,我可以这样强制:
var stream = new MemoryStream();
var defaultNamespace = ((XmlTypeAttribute)Attribute.GetCustomAttribute(typeof(Foo), typeof(XmlTypeAttribute))).Namespace;
new XmlSerializer(typeof(Foo), defaultNamespace).Serialize(stream, new Foo() { Bar = "hello" });
var xml = Encoding.UTF8.GetString(stream.ToArray());
那么输出是这样的:
<?xml version="1.0"?>
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://example.com">
<Bar>hello</Bar>
</Foo>
但我不同意我必须执行额外的步骤。反序列化时,需要类似的代码。该属性是否有问题,或者它是如何工作的,是否需要执行额外的步骤?
[XmlType]
既不设置根元素的名称也不设置名称空间。它设置 类型 它所在的 class。
要设置根元素的名称,请使用 [XmlRoot]
。
[XmlRoot(Name="FooElement", Namespace = "http://example.com")] // NS for root element
[XmlType(Name="FooType", Namespace = "http://example.com/foo")] // NS for the type itself
public class Foo
{
public string Bar { get; set; }
}
[XmlType]
设置的名称和命名空间将在您的序列化类型的 XML 架构中看到,可能在 complexType
声明中。如果需要,它也可能出现在 xsi:type
属性中。
以上声明将生成 XML
<ns1:FooElement xmlns:ns1="http://example.com">
与 XSD
<xsd:element name="FooElement" type="ns2:FooType" xmlns:ns2="http://example.com/foo"/>
我从 XSD 生成的类型如下所示:
[XmlType(Namespace = "http://example.com")]
public class Foo
{
public string Bar { get; set; }
}
像这样序列化时:
var stream = new MemoryStream();
new XmlSerializer(typeof(Foo)).Serialize(stream, new Foo() { Bar = "hello" });
var xml = Encoding.UTF8.GetString(stream.ToArray());
输出是这样的:
<?xml version="1.0"?>
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Bar xmlns="http://example.com">hello</Bar>
</Foo>
为什么根元素没有设置命名空间?当然,我可以这样强制:
var stream = new MemoryStream();
var defaultNamespace = ((XmlTypeAttribute)Attribute.GetCustomAttribute(typeof(Foo), typeof(XmlTypeAttribute))).Namespace;
new XmlSerializer(typeof(Foo), defaultNamespace).Serialize(stream, new Foo() { Bar = "hello" });
var xml = Encoding.UTF8.GetString(stream.ToArray());
那么输出是这样的:
<?xml version="1.0"?>
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://example.com">
<Bar>hello</Bar>
</Foo>
但我不同意我必须执行额外的步骤。反序列化时,需要类似的代码。该属性是否有问题,或者它是如何工作的,是否需要执行额外的步骤?
[XmlType]
既不设置根元素的名称也不设置名称空间。它设置 类型 它所在的 class。
要设置根元素的名称,请使用 [XmlRoot]
。
[XmlRoot(Name="FooElement", Namespace = "http://example.com")] // NS for root element
[XmlType(Name="FooType", Namespace = "http://example.com/foo")] // NS for the type itself
public class Foo
{
public string Bar { get; set; }
}
[XmlType]
设置的名称和命名空间将在您的序列化类型的 XML 架构中看到,可能在 complexType
声明中。如果需要,它也可能出现在 xsi:type
属性中。
以上声明将生成 XML
<ns1:FooElement xmlns:ns1="http://example.com">
与 XSD
<xsd:element name="FooElement" type="ns2:FooType" xmlns:ns2="http://example.com/foo"/>