【问题标题】:Multiple namespaces with XmlSerializer使用 XmlSerializer 的多个命名空间
【发布时间】:2012-01-04 03:49:14
【问题描述】:

这是场景:

我有嵌套类,需要在 xml 文档中进行序列化

[XmlRoot(Namespace="http://www.foo.bar/myschema")]
public class root 
{
    [XmlAttribute]
    public string version { get; set; }

    [XmlElement]
    public child child { get; set; }

    ...
}

[XmlRoot(Namespace="http://www.foo.bar/myschema")]
public class child
{
    [XmlElement]
    public int elemA { get; set; }

    [XmlElement]
    public string elemB { get; set; }

    ...
}

我创建了一个基于另一个示例的方法来删除额外的命名空间并设置一个自定义的:

public static void Save<T>(this T type, string path)
{
    System.Xml.Serialization.XmlSerializer xs = 
        new System.Xml.Serialization.XmlSerializer(type.GetType());

    System.Xml.Serialization.XmlSerializerNamespaces ns = 
        new System.Xml.Serialization.XmlSerializerNamespaces();
    ns.Add("", "http://www.foo.bar/myschema");

    using(XmlWriter file = XmlWriter.Create(path))
    {
        xs.Serialize(file, type, ns);
    }
}

我得到这个代码作为结果:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.foo.bar/myschema" version="2.00">
    <child>
        <elemA>1</elemA>
        ...
    </child>
</root>

但预期会这样:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.foo.bar/myschema" version="2.00">
    <child xmlns="http://www.foo.bar/myschema">
        <elemA>1</elemA>
        ...
    </child>
</root>

我们必须在两个标签中设置自定义命名空间声明。这可能吗?

编辑:

这是一个真实的例子:

<?xml version="1.0" encoding="UTF-8"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
    <idLote>200602220000001</idLote>
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
        <infNFe Id="NFe31060243816719000108550000000010001234567890" versao="1.01">
        ...
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        ...
    </NFe>
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
        <infNFe Id="NFe31060243816719000108550000000010011234567900" versao="1.01">
        ...
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        ...
    </NFe>
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
        <infNFe Id="NFe31060243816719000108550000000010021234567916" versao="1.01">
        ...
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        ...
    </NFe>
</enviNFe>

【问题讨论】:

    标签: c# .net xml serialization xmlserializer


    【解决方案1】:

    从 XML 的角度来看,您的示例是相同的,所以第一个非常好。如果你必须使用第二个,那么我们对 XML 的理解或你的处理管道存在严重问题。

    【讨论】:

    • 我又加了一个例子,这个定义有什么问题吗?
    • NFe标签的xmlns属性是多余的。 Signature 标记的命名空间是必需的。所以我很确定 XmlSerializer 不会为 NFe 输出 xmlns 属性,而是为 Signature 输出。你试过了吗?
    • 问题解决了!由于标签缩进字符,Web 服务拒绝了文档。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多