XmlSerializer в.NET с XmlSchemaForm.Unqualified
Учитывая следующий кусок кода:
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 ответ
Вы можете переопределить пространство имен, указанное в типе элемента. Например, вы можете иметь
[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.