- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
对于要使用的正确装饰器或可能需要的任何设计有点困惑。当序列化一个实现 IXmlSerializable 的类时,有没有办法在 XmlRoot 元素中包含命名空间及其前缀?
例如类定义。
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
[XmlRoot("Classy", Namespace = XML_NS)]
public class TestClass : IXmlSerializable
{
private const string XML_PREFIX = ""; // default namespace
private const string XML_NS = "www.123.com";
private const string XML_MEMBER_PREFIX = "me";
private const string XML_MEMBER_NS = "member.com";
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlsn {
get {
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add(XML_PREFIX, XML_NS);
xsn.Add(XML_MEMBER_PREFIX, XML_MEMBER_NS);
return xsn;
}
}
void IXmlSerializable.WriteXml(XmlWriter writer) {
writer.WriteElementString(XML_MEMBER_PREFIX, "Member1.5",
XML_MEMBER_NS, Member1);
writer.WriteElementString(XML_MEMBER_PREFIX, "Member2.5",
XML_MEMBER_NS, Member2.ToString());
writer.WriteElementString(XML_PREFIX, "Member3.5", XML_NS, Member3);
}
//[XmlElement(ElementName = "Member1.5", Namespace = XML_MEMBER_NS)]
public string Member1 {
get { return "init"; }
set { ; }
}
//[XmlElement(ElementName = "Member2.5", Namespace = XML_MEMBER_NS)]
public int Member2 {
get { return 3; }
set { ; }
}
//[XmlElement(ElementName = "Member3.5", Namespace = XML_NS)]
public string Member3 {
get { return "default namespace"; }
set { ; }
}
// ignore ReadXml/GetSchema
XmlSchema IXmlSerializable.GetSchema() { return null; }
void IXmlSerializable.ReadXml(XmlReader reader) { return; }
}
序列化时:
TestClass tc = new TestClass();
XmlSerializer ser = new XmlSerializer(typeof(TestClass));
ser(writer, tc, tc.xmlsn); // just a plain XmlWriter to Console.Out
输出是
<?xml version="1.0" encoding="utf-8"?>
<Classy xmlns="www.123.com">
<me:Member1.5 xmlns:me="member.com">init</me:Member1.5>
<me:Member2.5 xmlns:me="member.com">3</me:Member2.5>
<Member3.5>default namespace</Member3.5>
</Classy>
我期望的输出是:
<?xml version="1.0" encoding="utf-8"?>
<Classy xmlns:me="member.com" xmlns="www.123.com">
<me:Member1.5>init</me:Member1.5>
<me:Member2.5>3</me:Member2.5>
<Member3.5>default namespace</Member3.5>
</Classy>
第二个是 XmlSerializer 的输出,如果类的 IXmlSerializable 实现被删除并且您取消注释 XmlElement 装饰器。我知道返回的两个 Xml 文档都是有效的,但最好尝试删除多余的命名空间声明。我认为这样的事情是可能的,因为 IXmlSerializable 旨在更好地控制您的类的序列化/反序列化方式。
更新:一个非常有趣的答案建议修改 XmlWriterSettings!看起来这会通过修改 NamespaceHandling 属性来清除所有内容。然而,这仍然会导致为每个成员重写命名空间。完整序列化代码如下:
XmlSerializer ser = new XmlSerializer(typeof(TestClass));
TestClass tc = new TestClass();
XmlWriterSettings xmlSet = new XmlWriterSettings();
xmlSet.Encoding = System.Text.Encoding.UTF8;
xmlSet.Indent = true;
xmlSet.NamespaceHandling = NamespaceHandling.OmitDuplicates;
XmlWriter writer = XmlWriter.Create(Console.Out, xmlSet);
ser.Serialize(writer, tc); // with/without tc.xmlsn same result
writer.Flush();
writer.Close();
最佳答案
我只是向 WriteXml 添加了一个字符串属性。成功了!
void IXmlSerializable.WriteXml(XmlWriter writer) {
writer.WriteAttributeString("xmlns:me", "member.com");
writer.WriteAttributeString("xmlns", "www.123.com");
writer.WriteElementString(XML_MEMBER_PREFIX, "Member1.5",
XML_MEMBER_NS, Member1);
writer.WriteElementString(XML_MEMBER_PREFIX, "Member2.5",
XML_MEMBER_NS, Member2.ToString());
writer.WriteElementString(XML_PREFIX, "Member3.5", XML_NS, Member3);
}
并从类中删除 [XmlRoot("Classy", Namespace = XML_NS)]
和 xmlsn
属性。
关于c# - 带有 IXmlSerializable 的命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7575218/
我需要能够对内部类进行 Xml 序列化,因此我必须实现 IXmlSerializable。 这个类有两个字符串和一个列表。 我知道使用 WriteElementString 和 ReadElement
我有一个看起来像这样的 xml 文件: value value value value 我有两个对象代表这个 xml: class
.NET 中的 XML 序列化通过 XmlSerializer 构造函数的 extraTypes[] 参数允许多态对象。它还允许为实现 IXmlSerializable 的类型自定义 XML 序列化。
我正在实现 IXmlSerializable对于我的类的自定义(反)序列化逻辑,但希望根据 XSD 模式检查 XML 的读写。我添加了 XmlSchemaProviderAttribute : [Xm
假设我有两个类,一个基类和一个派生类。它们是相当简单的类,主要充当数据结构(派生类显然稍微复杂一些)。 public class BaseUserSession { // ... Variou
我试图创建一个通用的 Dictionary实现 IXmlSerializable (归功于 Charles Feduke )。 这是我的试验: Sub Main() Dim z As New
我正在构建一个将数据公开为 XML 的 REST API。我的域层中有一大堆域类,供 API 后面的服务层和我们将提供给客户的客户端 API 使用。 (客户确实可以选择直接与 REST API 交互,
是否有任何标记为 IXmlSerializable 的 .NET 通用集合?我已经尝试过 List 和 Collection,但都没有开箱即用。 在我推出自己的 collection、list 或 d
我对 xml 序列化有一个奇怪的要求。 请引用以下 C# 代码(由于变量 'rootName' 超出范围而无法编译)。我的意图是让我的类(class) GeneralData 成为“一般”。这意味着该
我有一个类: [Serializable] public class Profile { [XmlAttribute] private string[] permissions;
我想对我的对象 Exception 的实例进行 XML 序列化,并将其存储在另一个对象 ExceptionReport 的 XMLNode[] Nodes 属性中。 [System.Diagnosti
我有一个实现 IXmlSerializable 的类,如下所示: public class SomeClass : IXmlSerializable { public SomeSerializ
一旦程序员决定实现IXmlSerializable,实现它的规则和最佳实践是什么?我听说 GetSchema() 应该返回 null 并且 ReadXml 应该在返回之前移动到下一个元素。这是真的?那
我有这样的 xml: 2 6,501698000000 8,414278000000 9,29
对于要使用的正确装饰器或可能需要的任何设计有点困惑。当序列化一个实现 IXmlSerializable 的类时,有没有办法在 XmlRoot 元素中包含命名空间及其前缀? 例如类定义。 using S
我有以下类定义 [XmlRoot(ElementName = "person",Namespace = "MyNamespace")] public class Person : IXmlSerial
我有一个自定义类型的集合属性,它继承自 BindingList。目前,此属性通过 XmlSerializer 进行序列化,即使它没有 Setter。我现在正尝试在此自定义集合类上实现 IXmlSeri
初始问题 我要serialize一个List更改 IXmlSerializable 的 XmlType动态分类(所以我不能使用属性标签来做到这一点) 我已经尝试使用 XmlAttributeOverr
我发现 XmlSerializer 有一些有趣的行为。 如果我尝试序列化一个具有 Type 对象属性并且该对象实现了 IXmlSerializable 的类,序列化程序将抛出一个 InvalidOpe
基本上,最初的问题是我需要将 bool 值序列化为 0 或 1。我找到的解决方案是实现 IXmlSerializable,我确实这样做了。不幸的是,我试图序列化的类是从模式生成的代码,并且上面有一个
我是一名优秀的程序员,十分优秀!