由于客户端应用程序使用带有硬编码前缀的xpath,所以我必须在一些api端点生成的XML中添加名称空间前缀(不要让我开始使用。)>
我已经成功创建了一个自定义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
我正在寻找一种只包含要序列化的对象(或其任何子对象)实际使用的名称空间的方法。
由于我的所有对象都用relevent XML序列化属性(例如[XmlElement]
)进行注释,并且它们在需要的地方使用namespace参数,我想我可能会写出一些可怕的观点来绕过兔子洞,找到正在使用的命名空间方式。
但是,我希望有一个我看不到的更优雅(也许更明显)的解决方案:)
有什么想法吗?
由于客户端应用程序使用带有硬编码前缀的xpath,因此我必须为一些api端点生成的XML添加名称空间前缀(不要让我开始)。我已经成功创建了...
这是我最终使用反射实现此目的的方式: