【问题标题】:Generate XML from multiple classes从多个类生成 XML
【发布时间】:2011-04-01 10:13:36
【问题描述】:

我正在尝试使用 xsd.exe 工具生成的类生成 XML 文档。

想要的结构是这样的:

 <sh:StandardBusinessDocument xmlns:eanucc="urn:ean.ucc:2" xmlns:order="urn:ean.ucc:order:2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader ../Schemas/sbdh/StandardBusinessDocumentHeader.xsd urn:ean.ucc:2 ../Schemas/OrderProxy.xsd" xmlns:sh="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader">
  <sh:StandardBusinessDocumentHeader>
    <sh:HeaderVersion>2.2</sh:HeaderVersion>    
  </sh:StandardBusinessDocumentHeader>
  <eanucc:message>
    <entityIdentification>
        <uniqueCreatorIdentification>2222</uniqueCreatorIdentification>
    </entityIdentification> 
  </eanucc:message>
</sh:StandardBusinessDocument> 

但我只能做到这一点:

<sh:StandardBusinessDocument xmlns:eanucc="urn:ean.ucc:2" xmlns:order="urn:ean.ucc:order:2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader ../Schemas/sbdh/StandardBusinessDocumentHeader.xsd urn:ean.ucc:2 ../Schemas/OrderProxy.xsd" xmlns:sh="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader">
  <sh:StandardBusinessDocumentHeader>
    <sh:HeaderVersion>2.2</sh:HeaderVersion>    
  </sh:StandardBusinessDocumentHeader>
  <sh:message>
    <entityIdentification>
        <uniqueCreatorIdentification>2222</uniqueCreatorIdentification>
    </entityIdentification> 
  </sh:message>
</sh:StandardBusinessDocument> 

如何为根节点的子节点创建不同的节点前缀?在我生成的类中,我使用 XmlTypeAttribute 和 XmlRootAttribute 添加了命名空间,但对于第二个子属性,这些都被忽略了。我的课程具有以下属性:

[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader", IsNullable = true)]
public class StandardBusinessDocument
{
   private StandardBusinessDocumentStandardBusinessDocumentHeader standardBusinessDocumentHeaderField;

   private StandardBusinessDocumentMessage messageField;
} 

[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader", IsNullable = false)]
public class StandardBusinessDocumentStandardBusinessDocumentHeader : StandardBusinessDocument
{
}

[System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:ean.ucc:2")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:ean.ucc:2", IsNullable = true)]
public class StandardBusinessDocumentMessage
{
}

知道为什么忽略第二个孩子 (StandardBusinessDocumentMessage) 上的装饰吗?

【问题讨论】:

    标签: c# .net xml xsd xml-namespaces


    【解决方案1】:

    首先,在映射中为检索messageField 的属性指定命名空间(我假设有一个):

    [XmlElement(Namespace = "urn:ean.ucc:2")]
    public StandardBusinessDocumentMessage Message { get; set; }
    

    然后,在序列化对象时,创建 XmlSerializerNamespaces 类的实例,为其添加前缀和命名空间,并在将 XmlSerializerNamespaces 对象作为参数的 Serialize() 重载中使用它:

      XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
      ns.Add("eanucc", "urn:ean.ucc:2");
      ns.Add("sh", "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader");
      XmlSerializer xs = new XmlSerializer(typeof(StandardBusinessDocument));
      xs.Serialize(someStream, someInstance, ns);
    

    【讨论】:

    • 非常好 - 谢谢。添加 XmlElement 属性就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多