2009-03-05 6 views
7

Yani ben hala soruyorum soruları boş xmlns kaldır xml seri hale namepsace koleksiyonlarına boş ad gereksiz özelliklerini çekmemek için bu yüzden var niyetinde değildi, Nitelikler XML seri ile dekore, Yani bir nesne oluşturmak</p> <p>:-(Bu konu hakkında XML Serileştirme sonra "" =

Düzenleme:. Yani nitelik bunlar:

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

yüzden bana iki verir ekstra Öznitellikler.

fazla araştırma sonra gelen belgenin başlangıcını değiştirirseniz: **

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

için
writer.WriteStartElement("urlset"); 

** Sonra boş xmlns = "" özelliğini alamadım URL etiketleri. Bu harika AMA

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

.: kök elemanı xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" olması yani gerektirir Ama hala tefrika tip boş xmlns="" niteliğini olsun.

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

Sonra benim XmlWriter eklenecek için aşağıdaki kullanın: Bu benim bu

<url xmlns=""> 

herkes gibi bir Emtpy xmlns = "" sol am dışında, gayet iyi çalışıyor

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

herhangi bir fikir? Yine XmlTextWriter ve XmlDocument kullanarak bunu başarabilirim ama XmlWriter kullanarak bunu elde etmek gerekiyor.

Her türlü yardım büyük beğeni topluyor.

+0

> Sahip olmadığım gereksiz özniteliklerin elde edilememesi için xml serileştirme isim toplama koleksiyonlarına boş bir ad alanı ekliyorum. Bunu detaylandırır mısınız? Gereksiz özniteliklerle ne demek istiyorsun? – jro

+0

Bu bana iki ek özellik sunuyor. –

cevap

12

(sadece aynı ad alanında olmalarını ihtiyaç ve writter şaşırtmak almaması için ad sınıfını kullanın):

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

Ve çıktısı (sizin aradığın yorumlara göre):

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

Eğer 50 puan yukarı işaretleyebilirsem kendim yapardım! Büyük yazı ve bu konudaki zamanınız için teşekkür ederim. Gerçekten onu takdir ederim! Bir tedavi yaptı. + 1 + CEVAP :-) –

+0

Aynı örneği alın ve bu özelliği SitemapNode'a ekleyin: [XmlElement (ElementName = "value")] public string Değer {get; set; } Diziselleştirici neden IGNORES? – andrecarlucci

0

XmlRoot özniteliğinizdeki ad alanını belirtmediniz mi?

Yani: Bu işler

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

Evet, hala aynı, boş bir xmlns = "" –

+0

çıkarıyor ve XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add (String.Empty, String.Empty); ? – cjk

+0

İlk başta ancak çıktı şu şekilde oldu: Bu bana iki ek özellik sunuyor. –

3

Bir düğüme n Birden çok ad alanına sahip mevcut belge.

Ad alanını ne ayarlamış olursam sorun, ne olursa olsun her zaman xmlns referans özniteliğini ekler. Bu, siyah kutuların akışaşağı bir şeyi kırıyordu.

Sonunda bunun gibi bir şey yaparak etrafta dolaştım.

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