Генерация XML из нескольких классов - PullRequest
3 голосов
/ 01 апреля 2011

Я пытаюсь сгенерировать XML-документ, используя класс, созданный инструментом xsd.exe.

Желаемая структура выглядит следующим образом:

 <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 голосов
/ 01 апреля 2011

Сначала укажите пространство имен в сопоставлении для свойства, которое извлекает messageField (я предполагаю, что оно есть):

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

Затем при сериализации объекта создайте экземпляр класса XmlSerializerNamespacesдобавьте к нему префиксы и пространства имен и используйте его в перегрузке Serialize (), которая принимает объект XmlSerializerNamespaces в качестве параметра:

  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);
...