Por que um prefixo de namespace está sendo adicionado ao meu atributo XML?

Dec 14 2020

Eu tenho um violino aqui :

using System;
using System.Xml;
using System.IO;
using System.Text;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Starting");
        MemoryStream stream = new MemoryStream();
        var utf = new UTF8Encoding(false);
        XmlTextWriter writer = new XmlTextWriter(stream, utf);
        writer.Formatting = Formatting.Indented;
        writer.WriteStartDocument();
        
        writer.WriteProcessingInstruction("process", "5");
        writer.WriteComment("commenting");
        
        writer.WriteStartElement("dog");
        writer.WriteAttributeString("attribute", "www.windward.net", "5");
        
        writer.WriteStartElement("cat");
        
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Flush();
        
        string result = utf.GetString(stream.ToArray(), 0, (int) stream.Length);
        Console.WriteLine("XML: " + result);
    }
}

Estou adicionando um atributo sem um namespace sem prefixo. Ele está criando um prefixo de d1p1.

Por quê?

Respostas

1 kjhughes Dec 13 2020 at 23:52

Resposta em nível de código

Porque

    writer.WriteAttributeString("attribute", "www.windward.net", "5");

coloca attributeno www.windward.nete o prefixo do namespace é usado para fazer a associação.

Se você quiser attributeestar em nenhum namespace, remova o "www.windward.net"argumento do namespace:

    writer.WriteAttributeString("attribute", "5");

Resposta em nível XML

Atualização para endereço de comentário OP:

O que eu quero é que o atributo tenha o namespace www.windward.net, mas sem prefixo. Como eu posso fazer isso?

Isso equivale a querer que os namespaces padrão se apliquem aos atributos, o que é contrário à recomendação do namespace XML :

As declarações de namespace padrão não se aplicam diretamente a nomes de atributos; a interpretação de atributos não prefixados é determinada pelo elemento no qual eles aparecem.

Se você deseja que esses atributos estejam em um namespace, aceite o uso da API de um prefixo de namespace para colocá-los lá.


Veja também

  • Nomes de atributos XML e elementos no namespace padrão?
  • Namespaces e atributos de XML