在Xml序列化后删除空xmlns =“”

时间:2009-03-05 19:41:36

标签: c# .net xml xml-serialization

所以我仍在询问有关此主题的问题: - (

所以我创建了一个对象,用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");

**然后我没有在url标签中获得空的xmlns =“”属性。这很好但我确实要求根元素有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来实现它。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:12)

这是有效的(你只需要它们在同一个命名空间中,你使用命名空间类,这样写入器就不会混淆):

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

答案 1 :(得分:3)

我在将节点插入具有多个命名空间的现有文档时遇到了问题。

无论我将命名空间设置为什么,每次都会添加xmlns引用属性。这打破了下游的黑盒子。

我最终通过做这样的事情来解决这个问题。

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

答案 2 :(得分:0)

您是否尝试过不在XmlRoot属性中指定命名空间?

即:

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