从多个类生成XML

3

我正在尝试使用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)的装饰被忽略了?
1个回答

2

首先,在检索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属性解决了问题。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接