XmlSerializer в .NET с XmlSchemaForm.Unqualified - PullRequest
5 голосов
/ 02 августа 2011

Учитывая следующий фрагмент кода:

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 с тем же пространством имен, что и у корневого элемента?

Этот тип кода (часть XmlSchemaForm.Unqualified) генерируется WSCF.blueинструмент, и он портится с пространствами имен.

1 Ответ

0 голосов
/ 06 июля 2013

Вы можете переопределить пространство имен, указанное в типе элемента. Например. вы можете иметь

[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>

Реализация Microsoft Form = XmlSchemaForm.Unqualified, по-видимому, в точности соответствует установке Namespace на "". В частности, его нельзя использовать, если вы явно указали любое другое пространство имен ( ссылка MSDN ). Если вы это сделаете, вы получите это исключение:

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.

...