子类的 C# XML 序列化 - 从根节点中删除 xmlns:p1 和 p1:type 属性

本文关键字:p1 删除 xmlns 属性 type 根节点 XML 序列化 子类 | 更新日期: 2023-09-27 18:32:10

使用bog标准System.Xml.Serialization.XmlSerializer,我正在序列化一个对象的类继承自另一个对象。检查生成的 XML,根节点被赋予属性"p1:type"和"xmlns:p1":

<ApiSubmission ApiVersion="1" CustId="100104" p1:type="OrderConfirmationApiSubmission" 
    xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
    ...
</ApiSubmission>

有没有删除这些属性的好方法?

子类的 C# XML 序列化 - 从根节点中删除 xmlns:p1 和 p1:type 属性

所以我在

最初提出这个问题 ~5 年后遇到了同样的问题,并且对没有人回答感到失望。在搜索之后,我拼凑了一些东西,允许我去掉派生类中的类型属性。

    internal static string SerializeObject(object objectToSerialize, bool OmitXmlDeclaration = true, System.Type type = null, bool OmitType = false, bool RemoveAllNamespaces = true)
    {
        XmlSerializer x;
        string output;
        if (type != null)
        {
            x = new XmlSerializer(type);
        }
        else
        {
            x = new XmlSerializer(objectToSerialize.GetType());
        }
        XmlWriterSettings settings = new XmlWriterSettings() { Indent = false, OmitXmlDeclaration = OmitXmlDeclaration, NamespaceHandling = NamespaceHandling.OmitDuplicates };
        using (StringWriter swriter = new StringWriter())
        using (XmlWriter xmlwriter = XmlWriter.Create(swriter, settings))
        {
            x.Serialize(xmlwriter, objectToSerialize);
            output = swriter.ToString();
        }
        if (RemoveAllNamespaces || OmitType)
        {
            XDocument doc = XDocument.Parse(output);
            if (RemoveAllNamespaces)
            {
                foreach (var element in doc.Root.DescendantsAndSelf())
                {
                    element.Name = element.Name.LocalName;
                    element.ReplaceAttributes(GetAttributesWithoutNamespace(element));
                }
            }
            if (OmitType)
            {
                foreach (var node in doc.Descendants().Where(e => e.Attribute("type") != null))
                {
                    node.Attribute("type").Remove();
                }
            }
            output = doc.ToString();
        }
        return output;
    }

我使用它和 [XmlInclude] 基类中的派生类。然后 OmitType 和 RemoveAllNamespaces。实质上,派生类被视为基类。