【问题标题】:How to serialise with custom namespace如何使用自定义命名空间进行序列化
【发布时间】:2013-07-23 19:11:31
【问题描述】:

我正在将一个对象序列化为 XML,然后得到如下输出:

<?xml version="1.0" encoding="utf-8"?>
<SOrd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

但我希望它是这样的:

<SOrd xmlns:SOrd="http://..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://....xsd">

我该怎么做?

我尝试在序列化之前向根对象添加属性,还有这个:

XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xmlns:SOrd", "http://...");
xmlNameSpace.Add("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlNameSpace.Add("xsi:schemaLocation", "http://....xsd");

XmlSerializer xs = new XmlSerializer(ord.GetType());
TextWriter writer = new StreamWriter(outputPath, false);
xs.Serialize(writer, ord, xmlNameSpace);
writer.Close();

但我得到异常“':' 字符,十六进制值 0x3A,不能包含在名称中。”

【问题讨论】:

    标签: c# xml namespaces xml-serialization


    【解决方案1】:

    前缀不能包含“:”,去掉第一部分xmlns:

    您的代码略有改动:

    XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
    xmlNameSpace.Add("SOrd", "http://...");
    xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    xmlNameSpace.Add("schemaLocation", "http://....xsd");
    
    XmlSerializer xs = new XmlSerializer(ord.GetType());
    TextWriter writer = new StreamWriter(outputPath, false);
    xs.Serialize(writer, ord, xmlNameSpace);
    writer.Close();
    

    确保为每个类添加所需的属性,因为序列化属性不是继承的。有关属性检查的更多信息:How to deserialize concrete implementation of abstract class from XML

    编辑

    你可以像这样实现 xsi:shcemaLocation:

     [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar", DataType = "schemaLocation")]  
      public class Foo
      {
        [System.Xml.Serialization.XmlAttributeAttribute(AttributeName = "schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public string schemaLocation = "http://example";
      }
    

    【讨论】:

    • 我刚刚在阅读您的消息之前这样做了,它可以工作,但是 schemaLocation 需要有一个 xsi 前缀:我如何实现这个?
    • 谢谢它的工作:) 最后一件事是可以以某种方式订购模式定义吗?输出时它们似乎混合在一起
    • 我不认为这是可能的,或者至少我不知道这种方式。如果您使用 XmlWriter 创建文档除外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多