2009-03-05 56 views
7

所以我還是問的問題關於這個主題:-(XML序列化後,取下空的xmlns =「」

所以我創建了一個對象,與XML序列化屬性裝飾它,從我所看到的我添加空命名空間的XML序列化namepsace集合,以免讓多餘的屬性,我不打算有

編輯:我說的屬性是這些:

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

所以它給了我兩個額外屬性。

經過進一步調查,如果我改變文檔的開頭來源:**

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

writer.WriteStartElement("urlset"); 

**然後,我沒有得到空的xmlns =「」屬性的url標籤。這是偉大的,但我確實需要的根元素有xmlns="http://www.sitemaps.org/schemas/sitemap/0.9",即:

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

但我仍然得到的序列化類型的空xmlns=""屬性。

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

然後我用下面的追加到我的XmlWriter:

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

這工作了罰款只是我留下的emtpy的xmlns = 「」 像這樣

<url xmlns=""> 

任何人有任何想法嗎?我可以再次使用XmlTextWriter和XmlDocument來實現這一點,但我需要使用XmlWriter來實現它。

任何幫助,非常感謝。

+0

>我爲xml序列化namepsace集合添加一個空的名稱空間,以免得到我不打算擁有的多餘屬性。 你能詳細說明一下嗎?多餘的屬性意味着什麼? – jro 2009-03-05 19:55:56

+0

所以它給了我兩個額外的屬性。 – 2009-03-05 20:33:41

回答

12

這個工程(你只需要他們在相同的命名空間和使用的命名空間類,因此writter不混淆):

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

而輸出是(根據您的意見,這是你在找什麼):

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

您是否嘗試過在XmlRoot屬性中未指定名稱空間?

即:

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

是的,它仍然是一樣的,它輸出一個空的xmlns =「」 – 2009-03-05 19:49:00

3

我有麻煩插入節點到一個具有多個名稱空間的現有文檔。

無論我爲其設置名稱空間,每次都會添加xmlns引用屬性,無論如何。這打破了下游黑盒子。

我最終通過做這樣的事情來解決這個問題。

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