Мне нужно добавить префиксы пространства имен в XML, сгенерированные некоторыми из моих конечных точек API, из-за того, что клиентское приложение использует xpaths с жестко закодированными префиксами (не начинайте).
Я успешно создал пользовательский XmlSerializerOutputFormatter, который переопределяет метод Serialize
следующим образом:
public class CustomXmlOutputFormatter : XmlSerializerOutputFormatter
{
protected override void Serialize(XmlSerializer xmlSerializer, XmlWriter xmlWriter, object value)
{
var namespaces = new XmlQualifiedName[]
{
new XmlQualifiedName("xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XmlQualifiedName("t1", "my.namespace.one"),
new XmlQualifiedName("t2", "my.namespace.two"),
new XmlQualifiedName("t3", "my.namespace.three"),
};
var nsManager = new XmlSerializerNamespaces(namespaces);
xmlSerializer.Serialize(xmlWriter, value, nsManager);
}
}
И это работает, поскольку XML создается с использованием правильного префикса пространства имен.
Однако я ' Теперь я получаю все мои префиксы пространства имен в каждом сгенерированном XML, даже если они не используются. Например, xml ниже использует только элементы из пространства имен "t1", но, как я объявил все три в менеджере пространства имен, я получаю все три в xml:
<t1:MyRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:t1="my.namespace.one"
xmlns:t2="my.namespace.two"
xmlns:t3="my.namespace.three">
<t1:Hello>World</t1:Hello>
</t1:MyRootNode>
Это значительно увеличивает размер XML, так как у нас есть более 200 различных пространств имен, которые в общей сложности должны использоваться COULD - но каждая конечная точка фактически использует только два или три различных пространства имен макс.
То, что я ищу, - это способ включить только пространства имен, которые фактически используются сериализуемым объектом (или любым из его дочерних объектов).
Поскольку все мои объекты аннотируются с помощью соответствующего XML атрибуты сериализации (такие как [XmlElement]
) и они используют параметр пространства имен, где это необходимо, я думаю, я мог бы написать какое-то ужасное отражение в go вниз по кроличьей норе и найти любые пространства имен, используемые таким образом.
Однако я надеюсь, что есть более элегантное (и, вероятно, более очевидное) решение, которое я не вижу:)
Есть идеи?