gpt4 book ai didi

c# 子类的 XML 序列化 - 删除 xmlns :p1 and p1:type attributes from root node

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:11 46 4
gpt4 key购买 nike

使用沼泽标准 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>

有什么好的方法可以去除这些属性吗?

最佳答案

因此,在最初提出这个问题大约 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。本质上,派生类被视为基类。

关于c# 子类的 XML 序列化 - 删除 xmlns :p1 and p1:type attributes from root node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169383/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com