2009-03-05 1 views
7

Also von Ich bin immer noch Fragen zu diesem Thema :-(leer Xmlns entfernen = „“ nach XML-Serialisierung

So erstelle ich ein Objekt, dekorieren sie mit der XML-Serialisierung Attribute zu fragen, was ich ich ein Add gesehen haben leerer Namensraum in den xML-Serialisierung namepsace Sammlungen, um nicht die überflüssigen Attribute zu bekommen ich habe nicht die Absicht zu haben,

Edit:. Das Attribut ich meine, ist diese:

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

so gibt es mir zwei extra Attribute.

Nach einer weiteren Untersuchung, ob ich ändern Sie den Anfang des Dokuments aus: **

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

zu

writer.WriteStartElement("urlset"); 

** Dann bekomme ich nicht die leeren xmlns = "" Attribut in der URL-Tags Das ist toll, aber ich verlangen, dass das Wurzelelement hat xmlns="http://www.sitemaps.org/schemas/sitemap/0.9", d.h .:

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

Aber ich bekomme immer noch ein leeres xmlns="" Attribut in dem serialisierten Typ.

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

Dann benutze ich folgendes meine XmlWriter anhängen:

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

Dies funktioniert gut, außer ich mit einem emtpy xmlns = "" wie dieses

<url xmlns=""> 

Wer bin übrig geblieben irgendwelche Ideen? Wieder kann ich dies mit dem XmlTextWriter und dem XmlDocument erreichen, aber ich muss es mit dem XmlWriter erreichen.

Jede Hilfe wird sehr geschätzt.

+0

> Ich füge einen leeren Namespace zu den XML-Serialisierungsnamenpacesammlungen hinzu, um nicht die überflüssigen Attribute zu erhalten, die ich nicht haben wollte. Können Sie näher darauf eingehen? Was meinst du mit überflüssigen Attributen? – jro

+0

So gibt es mir zwei zusätzliche Attribute. –

Antwort

12

Dies funktioniert (Sie müssen sie nur im gleichen Namensraum sein und Sie die Namespace-Klasse, so dass die writter verwirren nicht):

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

Und die Ausgabe ist (basierend auf Ihren Kommentaren das ist, was Sie gesucht haben):

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

Wenn ich dir 50 Punkte nennen könnte, würde ich selbst !! Toller Beitrag, und vielen Dank für Ihre Zeit in dieser Angelegenheit. Ich schätze das wirklich! Arbeitete eine Belohnung. + 1 + ANTWORT :-) –

+0

Nehmen Sie das gleiche Beispiel und fügen Sie diese Eigenschaft SitemapNode: [XmlElement (ElementName = "Wert")] öffentliche Zeichenfolge Wert {get; einstellen; } Warum der Serializer es gerade IGNORIERT? – andrecarlucci

0

Haben Sie versucht, den Namespace in Ihrem XmlRoot-Attribut nicht anzugeben?

Ie:

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

Ja immer noch das gleiche, es gibt eine leere xmlns = "" –

+0

Und Entfernen der XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add (String.Empty, String.Empty); auch? – cjk

+0

Ich dachte zuerst, aber die Ausgabe ist wie folgt: So gibt es mir zwei zusätzliche Attribute. –

3

Ich hatte Probleme beim Einfügen eines Knotens in eine n bestehendes Dokument mit mehreren Namespaces.

Egal was ich den Namespace gesetzt habe, würde jedes Mal das xmlns Referenzattribut hinzufügen, egal was passiert. Das hat etwas Blackboxed Downstream gebrochen.

Ich kam schließlich um dies zu tun, indem Sie so etwas tun.

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