Я должен создать 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);
}
Во-первых, если бы потребитель вашей строки обрабатывал 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());
}