c# - usa - Gestión adecuada del espacio de nombre en.NET XmlWriter
tipos de namespace (4)
Esta publicación puede ser útil. También eche un vistazo a la propiedad Namespaces de las clases XmlTextWriter / XmlTextReader .
Utilizo las tecnologías .NET XML bastante extensamente en mi trabajo. Una de las cosas que más me gusta es el motor XSLT, más precisamente su extensibilidad. Sin embargo, hay una pequeña pieza que sigue siendo una fuente de molestia. Nada importante o algo con lo que no podamos vivir, pero nos impide producir el hermoso XML que nos gustaría producir.
Una de las cosas que hacemos es transformar nodos en línea e importar nodos de un documento XML a otro.
Lamentablemente, cuando guardas nodos en un XmlTextWriter
(en realidad, lo que XmlWriter.Create(Stream)
devuelve), las definiciones del espacio de nombres se lanzan allí, independientemente de si es necesario (previamente definido) o no. Obtienes el siguiente tipo de xml:
<root xmlns:abx="http://bladibla">
<abx:child id="A">
<grandchild id="B">
<abx:grandgrandchild xmlns:abx="http://bladibla" />
</grandchild>
</abx:child>
</root>
¿Alguien tiene una sugerencia sobre cómo convencer .NET para ser eficiente sobre sus definiciones de espacio de nombres?
Gracias, Boaz
PD. Como una ventaja adicional, me gustaría sobrescribir el espacio de nombres predeterminado, cambiándolo a medida que escribo un nodo.
No estoy seguro de que esto sea lo que estás buscando, pero puedes usar este tipo de código cuando comiences a escribir en la secuencia Xml:
myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla");
El XmlWriter debería recordarlo y no reescribirlo más. Puede que no sea 100% a prueba de balas, pero funciona la mayor parte del tiempo.
Usa este código:
using (var writer = XmlWriter.Create("file.xml"))
{
const string Ns = "http://bladibla";
const string Prefix = "abx";
writer.WriteStartDocument();
writer.WriteStartElement("root");
// set root namespace
writer.WriteAttributeString("xmlns", Prefix, null, Ns);
writer.WriteStartElement(Prefix, "child", Ns);
writer.WriteAttributeString("id", "A");
writer.WriteStartElement("grandchild");
writer.WriteAttributeString("id", "B");
writer.WriteElementString(Prefix, "grandgrandchild", Ns, null);
// grandchild
writer.WriteEndElement();
// child
writer.WriteEndElement();
// root
writer.WriteEndElement();
writer.WriteEndDocument();
}
Este código produjo el resultado deseado:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:abx="http://bladibla">
<abx:child id="A">
<grandchild id="B">
<abx:grandgrandchild />
</grandchild>
</abx:child>
</root>
¿Has intentado esto?
Dim settings = New XmlWriterSettings With {.Indent = True,
.NamespaceHandling = NamespaceHandling.OmitDuplicates,
.OmitXmlDeclaration = True}
Dim s As New MemoryStream
Using writer = XmlWriter.Create(s, settings)
...
End Using
Interesante es el ''NamespaceHandling.OmitDuplicates''