【问题标题】:How do I add a default namespace with no prefix using XMLSerializer如何使用 XMLSerializer 添加没有前缀的默认命名空间
【发布时间】:2011-01-30 19:16:14
【问题描述】:

我正在尝试使用XmlSerializer 生成一个包含默认命名空间但没有前缀的 XML 文档,例如

<?xml version="1.0" encoding="utf-8" ?>
<MyRecord ID="9266" xmlns="http://www.website.com/MyRecord">
    <List>
        <SpecificItem>

使用下面的代码...

string xmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(ExportMyRecord));
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
xmlnsEmpty.Add(string.Empty, string.Empty);
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, myRecord, xmlnsEmpty);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
xmlizedString = this.UTF8ByteArrayToString(memoryStream.ToArray());

和类结构...

[Serializable]
[XmlRoot("MyRecord")]
public class ExportMyRecord
{
    [XmlAttribute("ID")]
    public int ID { get; set; }

现在,我尝试了各种选择...

XmlSerializer xs = new XmlSerializer
                     (typeof(ExportMyRecord),"http://www.website.com/MyRecord");

或者...

[XmlRoot(Namespace = "http://www.website.com/MyRecord", ElementName="MyRecord")]

给我...

<?xml version="1.0" encoding="utf-8"?>
<q1:MylRecord ID="9266" xmlns:q1="http://www.website.com/MyRecord">
    <q1:List>
        <q1:SpecificItem>

我需要 XML 具有不带前缀的命名空间,因为它将提供给第三方提供商,并且他们拒绝所有其他替代方案。

【问题讨论】:

    标签: c# namespaces xmlserializer


    【解决方案1】:

    你去吧:

    ExportMyRecord instance = GetInstanceToSerializeFromSomewhere();
    XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
    xmlnsEmpty.Add(string.Empty, "http://www.website.com/MyRecord");
    var serializer = new XmlSerializer(
        instance.GetType(), 
        "http://www.website.com/MyRecord"
    );
    

    【讨论】:

    • 只是想注意你没有使用 xmlnsEmpty 并且可以省略。采用 XmlSerializerNamespaces 的序列化重载似乎没有使用 string.empty 值。
    • 太棒了!在我看到这个修复之前,&lt;q1:root xmlns:SomeAttr="urn" q1:SomeAttr="urn&gt; 也有问题。只需为我的解决方案添加一个额外的 XmlSerializerNamespace 即可
    • 序列化时使用xmlnsEmpty:serializer.Serialize(xmlTextWriter, myRecord, xmlnsEmpty);
    【解决方案2】:

    这是一个可用于任何类型的通用实现:

    public static void Serialize<T>(T instance, string defaultNamespace, Stream stream)
    {
        var namespaces = new XmlSerializerNamespaces();
        namespaces.Add(string.Empty, defaultNamespace);
        var serializer = new XmlSerializer(typeof(T), defaultNamespace);
        serializer.Serialize(stream, instance, namespaces);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2023-04-05
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多