C# xml序列化时如何去掉节点里的d2p1:type和xmlns:d2p1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# xml序列化时如何去掉节点里的d2p1:type和xmlns:d2p1相关的知识,希望对你有一定的参考价值。

序列化方法里用了

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
但是不管用

PersonalList里用到了派生类,SpecialPerson、SuperPerson继承自Personal,用了XmlClude

<?xml version="1.0" encoding="gb2312"?>
<PersonalList>
<Listname>Friends</Listname>
<Persons PersID="0">
<Name>Max Man</Name>
<City>Capitol City</City>
<Age>33</Age>
</Persons>
<Persons d2p1:type="SpecialPerson" PersID="1" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance">
<Name>Albert Einstein</Name>
<City>Ulm</City>
<Age>36</Age>
<SpecialInterests>Physics</SpecialInterests>
<班级信息>
<学生 姓名="Martha" 姓别="女" 生日="1989-10-09T00:00:00" />
</班级信息>
</Persons>
<Persons d2p1:type="SuperPerson" PersID="2" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance">
<Name>Superman</Name>
<City>Metropolis</City>
<Age>2147483647</Age>
<Skills>
<Skill>fly</Skill>
<Skill>strong</Skill>
</Skills>
<Alias>Clark Kent</Alias>
</Persons>
</PersonalList>

参考技术A 这个我真没办法,如果能改,那你就不能反序列化对象呢。
那个type说明了你应该反序列化成什么对象,而且这个d2p1是不影响反序列话的,
反序列话判断的是 名称控件即 http://www.w3.org/2001/XMLSchema-instance。所以我电脑上是
p2:type="SuperPerson" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"。
如果你要去掉的话,只有一个办法,自己拼写xml 用xmlWriter,
我简单些了个,需要做些修改,处理一些数组之类的
static public string MyXmlSerializer<T>(T obj)

PropertyInfo[] proinfo = obj.GetType().GetProperties();
StringBuilder sb = new StringBuilder();
XmlWriterSettings setting = new XmlWriterSettings();
setting.Encoding = UTF8Encoding.UTF8;
setting.Indent = true;
setting.OmitXmlDeclaration = false;
XmlWriter xw = XmlWriter.Create(sb,setting);
xw.WriteStartDocument(true);
xw.WriteStartElement("root");
foreach (PropertyInfo p in proinfo)

xw.WriteStartElement(p.Name);
xw.WriteString( p.GetValue(obj,null).ToString());
xw.WriteEndElement();

xw.WriteEndElement();
xw.WriteEndDocument();
xw.Close();
// proinfo[1].GetValue(obj, null);
return sb.ToString();
本回答被提问者和网友采纳

C#:带有循环链接的节点的 xml 序列化

【中文标题】C#:带有循环链接的节点的 xml 序列化【英文标题】:C# : xml serialization of nodes with cyclic links 【发布时间】:2011-05-25 20:20:33 【问题描述】:

我有一个类似这样的类节点:

class Node 
    IEnumerable<Node> inputs;

这基本上定义了一个简单的图形。 我想将我的图表序列化为人类可读的形式,所以通常我会说 xml 将是要走的路。 但是 XML 并没有考虑到循环依赖:)

那么 - 对我的图进行序列化的最佳方法是什么?

我能想到几个办法:

抛弃 XML,创建我自己的格式。 使用 XML,用唯一 ID 标记每个节点,将连接列表与节点分开存储并在加载后解析

但我认为其他人以前一定遇到过同样的问题,所以可能有一些更好的选择。 有人知道可靠的方法吗?

【问题讨论】:

【参考方案1】:

对于 xml,我会采用 id 方法(更改 DTO 模型,使其不是循环)。

注意DataContractSerializer 可以通过在重载构造函数中为preserveObjectReferences 选项传入true 来自动支持循环对象图;它不会像XmlSerializer 输出那么简单,但它仍然是可读的。

【讨论】:

【参考方案2】:

如果切换到 WCF DataContractSerializer,则可以保留对象引用(在 3.5 SP 1 及更高版本中)

[DataContract(IsReference=true)]

Sowmy 写得很好here

【讨论】:

以上是关于C# xml序列化时如何去掉节点里的d2p1:type和xmlns:d2p1的主要内容,如果未能解决你的问题,请参考以下文章

C#如何读取xml文件里面节点里面的属性信息?

C#序列化实体成XML后多了一个问号

C#:带有循环链接的节点的 xml 序列化

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?

如何在将 xml 反序列化为 c# 对象时获取单个 xml 元素的多个值?