.NET中的XmlSerializer与XmlSchemaForm.Unqualified

问题描述 投票:5回答:1

鉴于以下代码:

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工具生成的,它正在弄乱命名空间。

c# .net xml-serialization xml-namespaces wscf
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),则无法使用它。如果你这样做,你会得到这个例外:

Unhandled Exception: System.InvalidOperationException: There was an error reflecting type 'XmlSerializationTest.Root'. ---> System.InvalidOperationException: There was an error reflecting field 'Element'. ---> System.InvalidOperationException: The Form property may not be 'Unqualified' when an explicit Namespace property is present.

© www.soinside.com 2019 - 2024. All rights reserved.