Custom XML Formatter仅添加必需的名称空间

问题描述 投票:0回答:1

由于客户端应用程序使用带有硬编码前缀的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添加名称空间前缀(不要让我开始)。我已经成功创建了...

asp.net-web-api2 xml-serialization xml-namespaces xmlserializer
1个回答
0
投票

这是我最终使用反射实现此目的的方式:

© www.soinside.com 2019 - 2024. All rights reserved.