Remover xmlns vazios = “” depois de serialização XML
-
03-07-2019 - |
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 ??p>
<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.
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
{
...
}