4

次のような XML を生成する必要があります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<inboundMessage xmlns="http://www.myurl.net">
  <header>
    <password>mypwd</password>
    <subscriberId>myuser</subscriberId>
  </header>
  <message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="myType">
    <eventDate>2012-09-05T12:13:45.561-05:00</eventDate>
    <externalEventId />
    <externalId>SomeIdC</externalId>
  </message>
</inboundMessage>

問題は、タグに xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="myType" を含める方法がわからないことです。シリアル化する必要がある私のクラスは次のとおりです。

[XmlType("inboundMessage")]
[XmlRoot(Namespace = "http://www.myurl.net")]
public class InboundMessage
{
    [XmlElement(ElementName = "header")]
    public Header _header;
    [XmlElement(ElementName = "message")]
    public List<MyType> _messages;
}

「_messages」メンバーを希望どおりにシリアル化するには、どの XmlAttributes をメンバーに追加する必要がありますか?

エド・ティア

4

2 に答える 2

1

このように使用XmlAttributeします:

public class MyType
{
    [XmlAttribute("type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Type { get; set; }
}
于 2012-09-06T20:46:40.440 に答える
0

私の同僚は、いくぶん似たような解決策を思いつきましたが、さらに完全です。MyTypeには2つのプロパティが追加されました。

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces Namespaces { get; set; }

    [XmlAttribute("type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Type
    {
        get { return _type; }
        set { _type = value; }
    }

_typeは次のように定義されています。

    private string _type = "myType";

次に、シリアル化は別の方法で行われました。

        // declare an XmlAttributes object, indicating that the namespaces declaration should be kept
        var atts = new XmlAttributes { Xmlns = true };

        // declare an XmlAttributesOverrides object and ...
        var xover = new XmlAttributeOverrides();
        // ... add the XmlAttributes object with regard to the "Namespaces" property member of the "Message" type
        xover.Add(typeof(MyType), "Namespaces", atts);

        // set the Namespaces property for each message in the payload body
        var messageNamespaces = new XmlSerializerNamespaces();
        messageNamespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        foreach (var message in myInboundMessage._messages)
        {
            message.Namespaces = messageNamespaces;
        }

        // create a serializer
        var serializer = new XmlSerializer(object2Serialize.GetType(), xover);

        // add the namespaces for the root element
        var rootNamespaces = new XmlSerializerNamespaces();
        rootNamespaces.Add("", "http://www.myurl.net");

        // serialize and extract the XML as text
        string objectAsXmlText;
        using (var stream = new MemoryStream())
        using (var xmlTextWriter = new XmlTextWriter(stream, null))
        {
            serializer.Serialize(xmlTextWriter, object2Serialize, rootNamespaces);
            stream.Seek(0, SeekOrigin.Begin);
            var buffer = new byte[stream.Length];
            stream.Read(buffer, 0, (int)stream.Length);
            objectAsXmlText = Encoding.UTF8.GetString(buffer);
        }

最後に、InboundMessageは次のように装飾されました。

[XmlRoot("inboundMessage", Namespace = "http://www.myurl.net")]

このアプローチで、私は必要なものを正確に手に入れることができます。

于 2012-09-07T18:10:53.070 に答える