2009-03-05 8 views
7

domande Così sto ancora chiedendo su questo argomento :-(Rimuovere xmlns vuoti = "" dopo serializzazione XML

Così ho creato un oggetto, decorare con la serializzazione XML Attributi, da quello che ho visto io aggiungo un spazio dei nomi vuoto per le raccolte XML serializzazione namepsace in modo da non ottenere gli attributi superflui non ho intenzione di avere

Edit:. L'attributo intendo sono questi:

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

così mi dà due extra attributi.

Dopo ulteriori indagini se cambio l'inizio del documento da: **

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

a

writer.WriteStartElement("urlset"); 

** Allora io non capisco le xmlns = "vuoti" attributo nel tag url. Questo è grande MA richiedono che l'elemento radice ha xmlns="http://www.sitemaps.org/schemas/sitemap/0.9", cioè .:

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

Ma ancora ottenere un vuoto xmlns="" attributo nel tipo serializzato.

[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; 
    } 
} 

allora io uso il seguente per aggiungere al mio XmlWriter:

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

Questo funziona bene, tranne io sono rimasto con un xmlns emtpy = "" come questo

<url xmlns=""> 

Chiunque qualche idea? Ancora una volta posso ottenere questo utilizzando XmlTextWriter e XmlDocument, ma ho bisogno di farlo utilizzando XmlWriter.

Qualsiasi aiuto è molto apprezzato.

+0

> Aggiungo uno spazio dei nomi vuoto alle raccolte namepsace di serializzazione xml in modo da non ottenere gli attributi superflui che non intendevo avere. Potete approfondire questo? Cosa intendi con attributi superflui? – jro

+0

Quindi mi dà due attributi in più. –

risposta

12

Questo funziona (basta loro di essere nello stesso spazio dei nomi e si utilizza la classe spazi dei nomi in modo che il writter non confonde):

[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; 
    } 
} 

E il l'output è (in base ai commenti è quello che stavi cercando):

<?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

Se potessi segnarti 50 punti io stesso vorrei !! Ottimo post, e grazie per il tuo tempo in questa faccenda. Lo apprezzo molto! Ha funzionato a meraviglia. + 1 + RISPOSTA :-) –

+0

Prendi questo stesso esempio e aggiungi questa proprietà a SitemapNode: [XmlElement (ElementName = "valore")] stringa pubblica Valore {get; impostato; } Perché il serializzatore lo ignora semplicemente? – andrecarlucci

0

Hai provato a non specificare lo spazio dei nomi nell'attributo XmlRoot?

Ie:

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

Sì sempre lo stesso, emette un vuoto xmlns = "" –

+0

E rimuove XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add (String.Empty, String.Empty); pure? – cjk

+0

All'inizio l'ho pensato, ma l'output è il seguente: Quindi mi dà due attributi in più. –

3

Ho riscontrato problemi nell'inserire un nodo in un n documento esistente con più spazi dei nomi.

Indipendentemente dall'impostazione del namespace, l'attributo di riferimento xmlns viene aggiunto ogni volta, a prescindere da cosa. Questo stava rompendo qualcosa di nero scatolato a valle.

Alla fine ho capito questo facendo qualcosa del genere.

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