XmlSerializer: удалите ненужный xsi и xsd пространства имен

Предполагая, что данные находятся в объекте Pandas DataFrame df,

df['File_attribute'] = '{}'
df['Region_attribute'] = '{}'
124
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

//Add an empty namespace and empty value
ns.Add("", "");

//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);

//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns)
253
ответ дан 24 November 2019 в 01:05
поделиться

Есть альтернатива - вы можете предоставить член типа XmlSerializerNamespaces в типе для сериализации. Украсьте его атрибутом XmlNamespaceDeclarations . Добавьте префиксы пространства имен и URI к этому члену. Затем любая сериализация, которая явно не предоставляет XmlSerializerNamespaces, будет использовать пары префикс пространства имен + URI, которые вы поместили в свой тип.

Пример кода, предположим, что это ваш тип:

[XmlRoot(Namespace = "urn:mycompany.2009")]
public class Person {
  [XmlAttribute] 
  public bool Known;
  [XmlElement]
  public string Name;
  [XmlNamespaceDeclarations]
  public XmlSerializerNamespaces xmlns;
}

Вы можете сделать это:

var p = new Person
  { 
      Name = "Charley",
      Known = false, 
      xmlns = new XmlSerializerNamespaces()
  }
p.xmlns.Add("",""); // default namespace is emoty
p.xmlns.Add("c", "urn:mycompany.2009");

И это будет означать, что при любой сериализации этого экземпляра, в которой не указан собственный набор пар префикс + URI, будет использоваться символ "p "префикс для пространства имен" urn: mycompany.2009 ". Он также будет опускать пространства имен xsi и xsd.

Разница в том, что вы добавляете пространства имен XmlSerializerNamespace к самому типу, вместо того, чтобы использовать его явно при вызове XmlSerializer.Serialize (). Это означает, что если экземпляр вашего типа сериализуется с помощью кода, которым вы не владеете (например, в стеке веб-служб), и этот код явно не предоставляет XmlSerializerNamespaces, этот сериализатор будет использовать пространства имен, предоставленные в экземпляре.

6
ответ дан 24 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: