Omitindo instrução de processamento XML quando a serialização de um objeto
-
03-07-2019 - |
Pergunta
Estou a serialização de um objeto em um 1.1 aplicativo C # VS2003 / .Net. Eu preciso dele serializado sem a instrução de processamento, no entanto. Os puts classe XmlSerializer algo como isto:
<?xml version="1.0" encoding="utf-16" ?>
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
Existe alguma maneira de obter algo como o seguinte, sem processar o texto resultante para remover a tag?
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
Para aqueles que estão curiosos, minha aparência código como este ...
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
using ( TextWriter stringWriter = new StringWriter(builder) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Solução
O seguinte link irá levá-lo a um post onde alguém tem um método de suprimindo a instrução de processamento usando um XmlWriter e entrar em estado de um 'elemento' em vez de um estado 'Start'. Isso faz com que a instrução de processamento para não ser escrito.
Suprimir instrução de processamento
Se você passar um XmlWriter para o serializador, ele só irá emitir um processamento instrução se o estado do XmlWriter é 'Start' (ou seja, não teve nada gravados nele ainda).
// Assume we have a type named 'MyType' and a variable of this type named
'myObject'
System.Text.StringBuilder output = new System.Text.StringBuilder();
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output);
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter);
System.Xml.Serialization.XmlSerializer serializer = new
System.Xml.Serialization.XmlSerializer(typeof(MyType));
writer.WriteStartElement("MyContainingElement");
serializer.Serialize(writer, myObject);
writer.WriteEndElement();
Neste caso, o escritor estará em um estado de 'elemento' (dentro de um elemento) assim não há instrução de processamento será escrito. Um que você terminar de escrever o XML, você pode extrair o texto a partir do fluxo subjacente e processá-lo para conteúdo do seu coração.
Outras dicas
Eu fiz uma pequena correção
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Na versão 2.0, você usaria XmLWriterSettings.OmitXmlDeclaration , e serialize para um XmlWriter - no entanto eu não acho que isso existe no 1.1; por isso não inteiramente útil -., mas apenas mais um "considerar uma atualização" coisa ... e sim, eu percebo que não é sempre possível
E sobre omitindo namespaces?
em vez de usar
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
ex:
<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
Se por "instrução de processamento" você quer dizer a declaração xml, então você pode evitar isso, definindo a propriedade OmitXmlDeclaration de XmlWriterSettings. Você precisará serialize usando um XmlWriter, para alcançar este objetivo.
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = new StringWriter(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Mas ah, isso não responder à sua pergunta para 1.1. Bem, por referência a outros.
Isso funciona em .NET 1.1. (Mas você ainda deve considerar uma atualização)
XmlSerializer s1= new XmlSerializer(typeof(MyClass));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add( "", "" );
MyClass c= new MyClass();
c.PropertyFromDerivedClass= "Hallo";
sw = new System.IO.StringWriter();
s1.Serialize(new XTWND(sw), c, ns);
....
/// XmlTextWriterFormattedNoDeclaration
/// helper class : eliminates the XML Documentation at the
/// start of a XML doc.
/// XTWFND = XmlTextWriterFormattedNoDeclaration
public class XTWFND : System.Xml.XmlTextWriter
{
public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
public override void WriteStartDocument() { }
}