Pergunta

Então, eu ainda estou fazendo perguntas sobre este tema: - (

Então eu criar um objeto, decorá-lo com a serialização XML Atributos, pelo que eu vi que eu adicionar um namespace vazio para as coleções namepsace xml serialização de modo a não obter os atributos supérfluos eu não tinha a intenção de ter.

Editar: O atributo que quero dizer é isto:

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

para que ele me dá dois atributos extras.

Depois de uma investigação mais aprofundada, se eu mudar o início do documento a partir de: **

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

para

writer.WriteStartElement("urlset");

** Então eu não obter os xmlns vazios = "" atributo nas tags de URL. Isso é ótimo, mas eu exigir que o elemento raiz tem xmlns="http://www.sitemaps.org/schemas/sitemap/0.9", ou seja:.

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

Mas eu ainda obter um atributo xmlns="" vazio no tipo serializado.

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

Então eu uso o seguinte para anexar ao meu XmlWriter:

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

Isso funciona bem, exceto eu fiquei com um xmlns emtpy = "" como esta

<url xmlns="">

Qualquer pessoa alguma idéia? Mais uma vez eu posso conseguir isso usando o XmlTextWriter e o XmlDocument mas eu preciso para alcançá-lo usando o XmlWriter.

Qualquer ajuda é muito apreciada.

Foi útil?

Solução

Isso funciona (você só precisa deles para estar no mesmo namespace e você usar a classe namespaces para que o writter não confunde):

[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 a saída é (com base em seus comentários que é o que você estava procurando):

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

Outras dicas

Eu estava tendo problemas para inserir um nó em um documento existente com vários namespaces.

Não importa o que eu definir o namespace a ele iria adicionar o atributo de referência xmlns cada vez que não importa o que. Este foi quebrando preto algo em caixa jusante.

Eu finalmente tenho em torno deste fazendo algo assim.

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

Você já tentou não especificando o namespace em seu atributo XmlRoot?

ou seja:.

[XmlRoot(ElementName = "url")]
public class SitemapNode
{ 
...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top