2015-07-13 3 views
1

у меня возникают проблемы при получении моего элемента верхнего уровня, чтобы выглядеть так же, как это с помощью XmlSerializer (и атрибутов C#):Сериализация XML с C# класса, необходимо установить пространство имен

<rootObject xmlns="http://www.example.com/xmlschemas/nonStandardSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.com/xmlschemas/nonStandardSchema1.xsd"> 
    <otherSerializedObjects /> 
</rootObject> 

В настоящее время, ближайший я «ве получил это:

<rootObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    d1p1:schemaLocation="http://www.example.com/xmlschemas/nonStandardSchema1.xsd" 
    xmlns:d1p1="xsi" 
    xmlns="http://www.example.com/xmlschemas/nonStandardSchema"> 
    <otherSerializedObjects /> 
</rootObject> 

C#

[XmlRoot("rootObject", Namespace = "http://www.example.com/xmlschemas/nonStandardSchema")] 
public class RootObject 
{ 
    [XmlAttribute("schemaLocation", Namespace = "xsi")] 
    public string SchemaLocation { get; set; } 

    [XmlElement("Image")] 
    public Object[] OtherSerializedObjects { get; set; } 

    public RootObject() 
    { 
     OtherSerializedObjects = new Object[]{}; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var rootObject = new RootObject 
     { 
      SchemaLocation = "http://www.example.com/xmlschemas/nonStandardSchema1.xsd", 
      OtherSerializedObjects = new object[]{} 
     }; 

     var serializer = new XmlSerializer(typeof(RootObject)); 
     var stringWriter = new StringWriter(); 
     serializer.Serialize(stringWriter, rootObject); 
     Console.WriteLine(stringWriter.ToString()); 
    } 
} 

Любые идеи?

+1

Что вы пробовали? Как близко вы получили? Что конкретно означает «иметь проблемы»? – Erik

+0

Возможно, дубликат https://stackoverflow.com/questions/27530334/xml-serialization-namespaces – dbc

ответ

1

Во-первых, атрибут на вашем schemaLocation поля/свойства [XmlAttribute(Namespace=X)] необходимо иметь полное пространство имен для значения X, а не локального пространства имен ярлыка. Кстати, это может быть скорее свойство, чем поле. Использование поля для этой цели уничтожает память.

Во-вторых, чтобы устранить стандарт xmlns:xsd="http://www.w3.org/2001/XMLSchema", используйте перегруженность XmlSerializer.Serialize, где вы переходите на страницу XmlSerializerNamespaces с указанием только тех пространств имён.

Таким образом:

[XmlRoot("rootObject", Namespace = "http://www.example.com/xmlschemas/nonStandardSchema")] 
public class RootObject 
{ 
    public static XmlSerializerNamespaces GetAdditionalNamespaces() 
    { 
     XmlSerializerNamespaces xsNS = new XmlSerializerNamespaces(); 


     xsNS.Add("", "http://www.example.com/xmlschemas/nonStandardSchema"); 
     xsNS.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

     return xsNS; 
    } 

    [XmlAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public string XSDSchemaLocation 
    { 
     get 
     { 
      return "http://www.example.com/xmlschemas/nonStandardSchema1.xsd"; 
     } 
     set 
     { 
      // Do nothing - fake property. 
     } 
    } 

    [XmlElement("Image")] 
    public Object[] OtherSerializedObjects { get; set; } 

    public RootObject() 
    { 
     OtherSerializedObjects = new Object[]{}; 
    } 
} 

И затем использовать его как:

 var rootObject = new RootObject 
     { 
      OtherSerializedObjects = new object[]{} 
     }; 

     var serializer = new XmlSerializer(typeof(RootObject)); 
     var stringWriter = new StringWriter(); 
     var ns = RootObject.GetAdditionalNamespaces(); 

     var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " }; // For cosmetic purposes. 
     using (var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      serializer.Serialize(xmlWriter, rootObject, ns); 
     } 

     Console.WriteLine(stringWriter.ToString()); 

Пример fiddle.

+0

(Оглядываясь на старые вопросы) - это был правильный ответ, он работал так, как мне было нужно. Благодаря! – jack

0

Пространство имен должно быть полным пространством имен, а не сокращенной версией.

[XmlAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 

В моем тестировании он автоматически используется xsi.