.NET 中的 XmlSerializer 与 XmlSchemaForm.Unqualified

6

考虑以下代码:

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元素的命名空间被设置为"",即使它具有与根元素相同的命名空间的XmlTypeAttribute属性? WSCF.blue工具生成这种代码(XmlSchemaForm.Unqualified部分),它正在搞乱命名空间。

“unqualified” 表示目标命名空间中的属性不需要使用命名空间前缀进行限定。这就是为什么如果设置为“qualified”,你会得到 xmlns="" 的结果。正如你所说,这来自于一个自动化工具。请查看该工具是否有可配置选项。 - Aravind
@Aravind:我认为unqualified意味着序列化程序不必强制使用前缀(可以使用也可以不使用)。但我不明白为什么它会改变Element元素的命名空间(从"http://www.test.com"变成"")!不幸的是,WSCF.blue似乎没有适当的开关来修复这个问题。 - Stefan
1个回答

0

您可以覆盖元素类型中指定的命名空间。例如,您可以有

[XmlElement(Namespace="http://foo.com")]
public Element Element;

输出将会是:

<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="http://foo.com">
    <X xmlns="http://www.test.com">1</X>
  </Element>
</Root>

微软对Form = XmlSchemaForm.Unqualified的实现似乎与将Namespace设置为""完全等效。特别是,如果您明确指定了任何其他命名空间(MSDN reference),则不能使用它。如果这样做,您将会收到以下异常:

未处理的异常: System.InvalidOperationException: 反映类型“XmlSerializationTest.Root”时出现错误。 ---> System.InvalidOperationException: 反射字段“Element”时出错。 ---> System.InvalidOperationException: 在存在显式命名空间属性时,表单属性不得为'Unqualified'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接