XmlSerializer, производящий XML без префикса пространства имен

Я должен создать XML-файл со всеми снабженными префиксом элементами, как это:

<ps:Request num="123" xmlns:ps="www.ladieda.com">
   <ps:ClientId>5566</ps:ClientId>
<ps:Request>

Когда я сериализирую свой объект, c# умен и делает это:

<Request num="123" xmlns="www.ladieda.com">
   <ClientId>5566</ClientId>
<Request>

Это хорошо, потому что PS: не необходимо.

Но есть ли способ вынудить C# сериализировать все префиксы?

Мой сериализировать код является этим (для входящего объекта pObject):

String XmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(pObject.GetType());
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

xs.Serialize(xmlTextWriter, pObject);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
return XmlizedString;


private String UTF8ByteArrayToString(Byte[] characters)
{
    UTF8Encoding encoding = new UTF8Encoding();
    String constructedString = encoding.GetString(characters);
    return (constructedString);
}
6
задан John Saunders 14 May 2010 в 19:47
поделиться

1 ответ

Во-первых, если бы потребитель вашей строки обрабатывал XML, он не заботился бы о префиксе, поскольку он не имеет значения (для XML). Возможно, они не понимают XML и думают, что обрабатывают строку (которой может потребоваться строка «ps:» для каждого элемента).

Во-вторых, вам следует немного изменить свой код:

XmlSerializer xs = new XmlSerializer(pObject.GetType());
using (MemoryStream memoryStream = new MemoryStream())
{
    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Encoding = Encoding.UTF8
    };
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
    {
        xs.Serialize(writer, pObject);
    }
    return Encoding.UTF8.GetString(memoryStream.ToArray());
}

Это приведет к правильному удалению потока и XmlWriter в случае возникновения исключения, прекращению использования устаревшего класса XmlTextWriter и при этом по-прежнему будет возвращена строка, содержащая XML, написанный для UTF-8.

Наконец, чтобы управлять префиксом, см. «Как: квалифицировать имена элементов XML и атрибутов XML» :

XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces();
myNamespaces.Add("ps", "www.ladieda.com");

XmlSerializer xs = new XmlSerializer(pObject.GetType());
using (MemoryStream memoryStream = new MemoryStream())
{
    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Encoding = Encoding.UTF8
    };
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings))
    {
        xs.Serialize(writer, pObject, myNamespaces);
    }
    return Encoding.UTF8.GetString(memoryStream.ToArray());
}
15
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: