C# XmlSerializer移除XML输出中的类名父元素问题
解决C# XML序列化多余父元素的问题
针对你遇到的情况——序列化ObjKompParam类后,XML里多了一层<ADSobjotsing>父元素,而你希望把类的子元素直接放到<prod:ADSobjotsing>节点下——这里有两种实用的解决方法:
方法一:直接用LINQ to XML构建元素(最直接)
既然你已经在使用LINQ to XML,完全可以跳过XmlSerializer,直接根据参数对象的值构建需要的XML结构,这样能精准控制节点层级,避免多余嵌套:
protected override XElement ComposeQueryBody(object InputParams) { ObjKompParam param = (ObjKompParam)InputParams; var body = new XElement(SOAPNS + "Body", new XElement(prod + "ADSobjotsing", // 只添加非空的元素,避免生成空节点 !string.IsNullOrWhiteSpace(param.Tekst) ? new XElement("aadressTekst", param.Tekst) : null, !string.IsNullOrWhiteSpace(param.OID) ? new XElement("adsOid", param.OID) : null ) ); return body; }
这种方法的优势是代码直观,完全掌控XML结构,不需要处理序列化带来的额外节点,适合结构简单的类。
方法二:调整XmlSerializer的使用方式(保留序列化逻辑)
如果你更倾向于保留XmlSerializer的序列化逻辑,可以直接将对象序列化到目标<prod:ADSobjotsing>元素中,而不是先序列化到内存流再加载。这样就能跳过生成多余根节点的步骤:
protected override XElement ComposeQueryBody(object InputParams) { ObjKompParam param = (ObjKompParam)InputParams; var body = new XElement(SOAPNS + "Body", new XElement(prod + "ADSobjotsing") ); var targetNode = body.Descendants(prod + "ADSobjotsing").First(); var ns = new XmlSerializerNamespaces(); ns.Add("", ""); // 清空默认命名空间 var serializer = new XmlSerializer(typeof(ObjKompParam)); // 直接向目标节点写入序列化内容,不生成根节点 using (var writer = targetNode.CreateWriter()) { serializer.Serialize(writer, param, ns); } return body; }
为什么原来的代码会产生多余元素?
你原来的代码中,XmlSerializer.Serialize会根据类上标注的XmlType("ADSobjotsing")生成一个根节点<ADSobjotsing>,之后你又把这个节点作为子元素添加到<prod:ADSobjotsing>里,自然就形成了不必要的嵌套。而上面的方法二通过直接将序列化内容写入目标节点,跳过了生成根节点的步骤,直接把类的属性元素放到了<prod:ADSobjotsing>下面。
两种方法都能生成你期望的XML结构:
return (<SOAP-ENV:Body> <prod:ADSobjotsing> <aadressTekst>Sügise 10</aadressTekst> </prod:ADSobjotsing> </SOAP-ENV:Body> )
内容的提问来源于stack exchange,提问作者kirkeN
相关产品推荐
相关产品推荐

