Я пытаюсь сгенерировать 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)?
Сначала укажите пространство имен в сопоставлении для свойства, которое извлекает messageField (я предполагаю, что оно есть):
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);