2009-03-05 31 views
7

preguntas Así que todavía estoy preguntando sobre este tema :-(xmlns = vacías "" después de la serialización XML

lo tanto, crear un objeto, decorar con la serialización XML atributos, por lo que he visto agrego una espacio de nombres vacío a las colecciones de la serialización XML espacio de nombre a fin de no obtener los atributos superfluos que no tenía la intención de tener

Editar:. El atributo que quiero decir es esto:

<url xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns=""> 

por lo que me da dos extra atributos.

Después de investigaciones adicionales si cambio el principio del documento a partir de: **

writer.WriteStartElement("urlset","http://www.sitemaps.org/schemas/sitemap/0.9"); 

a

writer.WriteStartElement("urlset"); 

** Entonces no consigo los vacíos xmlns = "" atributo en el etiquetas url. Esto es genial, pero no se requiere que el elemento raíz tiene xmlns="http://www.sitemaps.org/schemas/sitemap/0.9", es decir .:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 

Pero aún así obtener una xmlns="" atributo vacío en el tipo de serie.

[XmlRoot(ElementName = "url", Namespace="")] 
public class SitemapNode 
{ 
    [XmlElement(ElementName = "loc")] 
    public string Location { get; set; } 
    [XmlElement(ElementName = "lastmod")] 
    public DateTime LastModified { get; set; } 
    [XmlElement(ElementName = "changefreq")] 
    public SitemapChangeFrequency ChangeFrequency { get; set; } 
    [XmlElement(ElementName = "priority")] 
    public decimal Priority { get; set; } 

    public SitemapNode() 
    { 
     Location = String.Empty; 
     LastModified = DateTime.Now; 
     ChangeFrequency = SitemapChangeFrequency.monthly; 
     Priority = 0.5M; 
    } 

    public SitemapNode(string location, DateTime lastModified, SitemapChangeFrequency changeFrequency, decimal priority) 
    { 
     Location = location; 
     LastModified = lastModified; 
     ChangeFrequency = changeFrequency; 
     Priority = priority; 
    } 
} 

Entonces la siguiente manera para anexar a mi XmlWriter:

foreach (uk.co.andrewrea.SitemapNode node in List) 
{ 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add(String.Empty, String.Empty); 
    Serializer.Serialize(Writer, node, ns); 
} 

Esto funciona bien, excepto yo me quedo con un xmlns emtpy = "" como este

<url xmlns=""> 

Cualquiera ¿algunas ideas? Nuevamente puedo lograr esto usando XmlTextWriter y XmlDocument pero necesito lograrlo usando XmlWriter.

Cualquier ayuda es muy apreciada.

+0

> Agrego un espacio de nombre vacío a las colecciones de nombre de serie de xml para no obtener los atributos superfluos que no tenía la intención de tener. ¿Puede profundizar en esto? ¿Qué quieres decir con atributos superfluos? – jro

+0

Entonces me da dos atributos adicionales. –

Respuesta

12

Esto funciona (que acaba de ellos necesitan estar en el mismo espacio de nombres y se utiliza la clase de espacios de nombres por lo que el escritor no confunde):

[TestMethod] 
public void TestMethod3() 
{ 
    var list = new []{new SitemapNode("1", DateTime.Now, 1), new SitemapNode("2", DateTime.Now.AddDays(1), 2)}; 
    var serializer = new XmlSerializer(typeof(SitemapNode)); 
    var st = new MemoryStream(); 
    using (var writer = XmlWriter.Create(st)) 
    { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add("", "test"); 
     writer.WriteStartElement("test", "test"); 
     foreach (SitemapNode node in list) 
     { 
      serializer.Serialize(writer, node, ns); 
     } 
     writer.WriteEndElement(); 
    } 
    st.Position = 0; 
    TestContext.WriteLine(new StreamReader(st).ReadToEnd()); 
} 


[XmlRoot(ElementName = "url", Namespace = "test")] 
public class SitemapNode 
{ 
    [XmlElement(ElementName = "loc")] 
    public string Location { get; set; } 
    [XmlElement(ElementName = "lastmod")] 
    public DateTime LastModified { get; set; } 
    [XmlElement(ElementName = "priority")] 
    public decimal Priority { get; set; } 

    public SitemapNode() 
    { 
     Location = String.Empty; 
     LastModified = DateTime.Now; 
     Priority = 0.5M; 
    } 

    public SitemapNode(string location, DateTime lastModified, decimal priority) 
    { 
     Location = location; 
     LastModified = lastModified; 
     Priority = priority; 
    } 
} 

Y el salida (basado en sus comentarios que es lo que estaba buscando):

<?xml version="1.0" encoding="utf-8"?><test xmlns="test"> 
<url><loc>1</loc><lastmod>2009-03-05T13:35:54.6468-07:00</lastmod><priority>1</priority></url> 
<url><loc>2</loc><lastmod>2009-03-06T13:35:54.6478-07:00</lastmod><priority>2</priority></url></test> 
+1

¡Si pudiera marcarle 50 puntos, me gustaría! Gran publicación, y gracias por su tiempo en este asunto. ¡Realmente lo aprecio! Funcionó una delicia. + 1 + RESPUESTA :-) –

+0

Tome este mismo ejemplo y agregue esta propiedad a SitemapNode: [XmlElement (ElementName = "value")] public string Value {get; conjunto; } ¿Por qué el serializador simplemente lo IGNORA? – andrecarlucci

0

¿Ha intentado no especificar el espacio de nombres en su atributo XmlRoot?

Es decir:

[XmlRoot(ElementName = "url")] 
public class SitemapNode 
{ 
... 
} 
+0

Sí, sigue siendo lo mismo, emite un vacío xmlns = "" –

+0

Y eliminando el XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add (String.Empty, String.Empty); también? – cjk

+0

Pensé que al principio, pero la salida es la siguiente: Así que me da dos atributos adicionales. –

3

Estaba teniendo problemas para insertar un nodo en un n documento existente con múltiples espacios de nombres.

Independientemente de lo que establezca el espacio de nombre, agregaría el atributo de referencia xmlns cada vez que pase lo que pase. Esto estaba rompiendo algo negro en la caja río abajo.

Eventualmente solucioné esto haciendo algo como esto.

XmlNode newNode = newDoc.SelectSingleNode(xpathQuery, manager); 
newNode.Attributes.RemoveAll(); 
node.ParentNode.InsertAfter(node.OwnerDocument.ImportNode(newNode, true), node); 
Cuestiones relacionadas