【发布时间】:2011-08-02 05:56:35
【问题描述】:
给定以下代码:
using System;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace XmlSerializationTest
{
[XmlType(Namespace = "http://www.test.com")]
public class Element
{
[XmlElement]
public int X;
}
[XmlRoot(Namespace = "http://www.test.com")]
public class Root
{
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public Element Element;
}
public static class Program
{
public static void Main(string[] args)
{
var root = new Root { Element = new Element { X = 1 } };
var xmlSerializer = new XmlSerializer(typeof(Root));
xmlSerializer.Serialize(Console.Out, root);
}
}
}
输出是:
<?xml version="1.0" encoding="ibm852"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com">
<Element xmlns="">
<X xmlns="http://www.test.com">1</X>
</Element>
</Root>
问题是为什么将 Form 属性设置为 XmlSchemaForm.Unqualified 会导致 Element 元素的命名空间被设置为 "",即使它具有与 Root 元素具有相同命名空间的 XmlTypeAttribute 属性?
这种代码(XmlSchemaForm.Unqualified 部分)是由WSCF.blue 工具生成的,它与命名空间混淆了。
【问题讨论】:
-
"unqualified" 表示来自目标命名空间的属性不需要使用命名空间前缀进行限定。所以这就是为什么你得到 xmlns="" 如果设置为合格,一切都很好。正如你所说,它来自一个自动化工具。查看工具中是否有可配置的选项。
-
@Aravind:我认为不合格意味着序列化程序不强制使用前缀(它可能会也可能不会)。但我不明白为什么它会改变元素元素的命名空间(从“test.com”到“”)!不幸的是,WSCF.blue 似乎没有正确的开关来解决这个问题。
标签: c# .net xml-serialization xml-namespaces wscf