Serializacja XML i prefiksy przestrzeni nazw

Szukam sposobu Z C#, w którym mogę serializować klasę do XML i dodać przestrzeń nazw, ale zdefiniować prefiks, którego ta przestrzeń nazw będzie używać.

Ostatecznie próbuję wygenerować następujący XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>

Wiem, że z DataContractSerializer i XmlSerializer Mogę dodać przestrzeń nazw, ale wydają się generować prefiks wewnętrznie, z czymś, czego nie jestem w stanie kontrolować. Czy mogę go kontrolować za pomocą jednego z tych serializerów (mogę użyć jednego z nich)?

If I ' m not w stanie kontrolować generowanie przestrzeni nazw będę musiał napisać swój własny serializer XML, a jeśli tak, to co jest najlepsze, aby go napisać?

Author: Zarepheth, 2010-02-26

2 answers

Aby kontrolować alias przestrzeni nazw, użyj XmlSerializerNamespaces.

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("childNode")]
    public string Value { get; set; }
}

static class Program
{
    static void Main()
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("myNamespace", "http://flibble");
        XmlSerializer xser = new XmlSerializer(typeof(MyType));
        xser.Serialize(Console.Out, new MyType(), ns);
    }
}

Jeśli chcesz zmienić przestrzeń nazw w czasie wykonywania, możesz dodatkowo użyć XmlAttributeOverrides.

 93
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 05:01:20

W przypadku użycia kodu wygenerowanego ze schematu, w którym typy mają przestrzenie nazw, to nadpisanie przestrzeni nazw jest stosowane na poziomie głównym, ale znaczniki różnych typów będą miały przestrzeń nazw powiązaną z klasą.

Miałem okazję użyć dwóch różnych generowanych klas, ale mają różne przestrzenie nazw w zależności od tego, z jakim serwerem rozmawiałem (nie pytaj nie pod moją kontrolą).

Próbowałem wszystkich nadpisań oferowanych tutaj i w końcu się poddałem i użyłem pewnego rodzaju brutala metoda siłowa, która faktycznie działała całkiem dobrze. To, co zrobiłem, to serializacja do sznurka. Następnie użyj string.replace to change the namespaces then posted the stream from the string by using a stringwriter. To samo w odpowiedzi-przechwytywanie łańcucha-manipulowanie przestrzenią nazw, a następnie deserializacja łańcucha z edytora łańcuchów.

Może nie jest elegancki lub używa wszystkich fantazyjnych przesłonięć, ale udało się.

 3
Author: impangolin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 02:59:36