Три проблемы форматирования XML с .NET XmlSerializer - PullRequest
3 голосов
/ 17 августа 2010

У меня три проблемы с некоторыми данными, которые я сериализирую.

Во-первых, он выдает <<code>?xml version="1.0" encoding="utf-8"?>, но программа, в которую я загружаю его, хочет только <<code>?xml version="1.0"?>

Во-вторых, всякий раз, когда данные пусты, они будут использовать сокращение для закрытия тега (<z303-profile />), но программа, в которую я загружаю их, не примет это и требует <z303-profile></z303-profile>

Наконец, у меня есть некоторые данные, которые я не могу гарантировать, как долго это будет, поэтому я храню их в списке. Мне нужно, чтобы у каждого элемента был свой заголовок z305, но он выводит имя списка, в котором они находятся в первую очередь, что все портит. Отображается следующим образом

    <z305List>
      <z305>
        ....
      </z305>
      <z305>
        ....
      </z305>
    </z305List>

со списком, хранящимся как

[XmlArrayItem("z305")]
public List<LocalPatronInfo> z305List = new List<LocalPatronInfo>();

Код, который я использую для сериализации, выглядит следующим образом

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer xmls = new XmlSerializer(typeof(AllRecords));
TextWriter tw = new StreamWriter(richTextBoxWorkingDir.Text + "\\" + filename);
xmls.Serialize(tw, allRecords, ns);
tw.Close();

1 Ответ

1 голос
/ 30 августа 2010

Мне кажется, я нашел решение первых двух проблем с моей третьей попыткой.Конечно, совет был на этом сайте (где еще это может быть?Поэтому, когда вы делаете свой собственный XMlWriter .. почти все возможно.Пожалуйста, посмотрите на следующий код:

public class XmlTextWriterFull : XmlTextWriter
{
    public XmlTextWriterFull(TextWriter sink) : base(sink) { }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }

    public override void WriteStartDocument()
    {
        base.WriteRaw("<?xml version=\"1.0\"?>");
    }
}

public class temp
{
    public int a = 0;
    public List<int> x = new List<int>();
}

class Program
{
    static void Main(string[] args)
    {
        XmlTextWriterFull writer = new XmlTextWriterFull(Console.Out);

        XmlSerializer xs = new XmlSerializer(typeof(temp));
        xs.Serialize(writer,new temp());
        Console.ReadKey();
    }
}
...