2011-08-02 15 views
5

Biorąc pod uwagę następujący fragment kodu:XmlSerializer w .NET z 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); 
     } 
    } 
} 

wyjście jest:

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

Pytanie dlaczego ustawienie właściwości Form do XmlSchemaForm.Unqualified przyczyną tej Element Przestrzeń nazw elementu jest ustawiona na "", nawet jeśli ma atrybut XmlTypeAttribute z tą samą przestrzenią nazw co element główny?

Ten rodzaj kodu (część XmlSchemaForm.Unqualified) jest generowany przez narzędzie WSCF.blue i komplikuje on przestrzeń nazw.

+0

„bez zastrzeżeń” wskazuje, że atrybuty od docelowej przestrzeni nazw nie muszą być kwalifikowane z przedrostka przestrzeni nazw. Dlatego właśnie dostajesz xmlns = "", jeśli jest ustawione na kwalifikowane, wszystko w porządku. Jak już powiedziałeś, z automatycznego narzędzia. Sprawdź, czy w narzędziu znajdują się konfigurowalne opcje. – Aravind

+0

@Aravind: Myślę, że bez kwalifikacji oznacza, że ​​serializator nie jest zmuszony do używania prefiksu (może, ale nie musi). Ale nie widzę powodu, aby ZMIENIŁ bazę nazw elementu elementu (z "http://www.test.com" na "")! Niestety, WSCF.blue nie wydaje się mieć odpowiedniego przełącznika do naprawy. – Stefan

Odpowiedz

0

Można zastąpić przestrzeń nazw określoną w typie elementu. Na przykład. można mieć

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

a wyjście byłoby

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

realizacja przez Microsoft Form = XmlSchemaForm.Unqualified wydaje się być dokładnie równoważne ustawieniu Namespace do "". W szczególności nie można go użyć, jeśli jawnie określono inną przestrzeń nazw (MSDN reference). Jeśli to zrobisz, dostaniesz ten wyjątek:

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.