2012-03-09 6 views
0

.NETで以下のXMLにオブジェクトをシリアル化する必要があります。.NETでこのXMLを作成するにはどうすればよいですか?

<ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0"> 
    <ns2:ApplicationArea> 
     <ns2:Sender> 
      <ns2:CreatorNameCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:TextType">SomeVendor</ns2:CreatorNameCode> 
      <ns2:SenderNameCode name="Dave"/> 
     <ns2:Sender> 
    </ns2:ApplicationArea> 
</ns2:ProcessRepairOrder> 

具体的には、次のとおりです。

おそらく最も簡単な方法は、私は次のスキーマでの出力に行うために何が必要です....による最終結果の上に私が必要とする制御にIXMLSerializableを実装することです名前空間のない接頭辞、xsi:type私はXMLに入ることができません。

フルバージョンは、次のようになります。あなたは、.NET 3.5を使用することが

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
    <ns1:PutMessage xmlns:ns1="http://www.starstandards.org/webservices/2009/transport" xmlns:ns2="http://www.starstandard.org/STAR/5" xmlns:ns3="http://www.openapplications.org/oagis/9"> 
     <ns1:payload> 
     <ns1:content> 
      <ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0"> 
      ...many more XML elements 
     </ns2:ProcessRepairOrder> 
    </ns1:PutMessage> 
    </S:Body> 
</S:Envelope> 
+0

私はすべて考えることができます - これは、IXMLSerializableを実装し、内部にXMLDocumentを使用することを含みます。私は上記の方法を知りません。私は例を貼り付けることができますが、必要なものを生成しない約50行のコードがあるので、それらは疑問を混乱させます。 –

+0

IXMLSerializableを実装したときに何が起こりましたか? –

+0

* .xsdファイルをxsd.exeに送り込み、クラスを生成してシリアル化に使用してみましたか? – AVIDeveloper

答えて

2

ていますか?もしそうなら、LINQ-to-XMLを使いやすくすることができます。 LINQは-に-XML、およびthis linkはどのように説明して使用してXMLトレスを作成する方法を参照するには

XNamespace ns2 = "some-uri"; 
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 

XElement root = new XElement("Root", 
    // Define ns2 namespace on Root element 
    new XAttribute(XNamespace.Xmlns + "ns2", ns2.NamespaceName), 
    new XElement(ns2 + "ProcessRepairOrder", 
     // Attributes of ProcessRepairOrder 
     new XAttribute("languageCode", "de-DE"), 
     new XAttribute("releaseID", "1.0"), 
     new XAttribute("systemEnvironmentCode", "PROD"), 
     new XAttribute("versionID", "1.0"), 
     // Child elements of ProcessRepairOrder 
     new XElement(ns2 + "ApplicationArea", 
      new XElement(ns2 + "Sender", 
       new XElement(ns2 + "CreatorNameCode", 
        // Attributes of CreatorNameCode and define xsi namespace 
        new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), 
        new XAttribute(xsi + "type", "ns3:TextType"), 
        // Value of CreatorNameCode, 
        "SomeVendor" 
       ), 
       new XElement(ns2 + "SenderNameCode", 
        // Attributes of SenderNameCode 
        new XAttribute("name", "Dave") 
       ) 
      ) 
     ) 
    ) 
); 

あなたはthis MSDN pageで見ることができます:ここにあなたの質問に正確にXML出力を生成します、私がテストしたいくつかのコードですそれらにXML名前空間を適用します。

編集:そうです

下のコメントに続いて、あなたが私が上記で定義されてきたルート要素を持つことができないという点で、より少ない標準的なアプローチをしたいようだが、LINQからXMLへ正しい名前空間が定義された有効なXML構造を作成するために必要とします。このアプローチを使用したい場合は、周囲に道がありますが、出力をもう少し詳しく調べる必要があります。ほとんどが

<ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0" xmlns:ns2="some-uri"> 
    <ns2:ApplicationArea> 
    <ns2:Sender> 
     <ns2:CreatorNameCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:TextType">SomeVendor</ns2:CreatorNameCode> 
     <ns2:SenderNameCode name="Dave" /> 
    </ns2:Sender> 
    </ns2:ApplicationArea> 
</ns2:ProcessRepairOrder> 

が、使用するので、LINQからXMLへのProcessRepairOrderxmlns:ns2名前空間を挿入していることに気づく:私は上に書いた、その後root.Elements().First().ToString()を行うことは、このシリアル化されたXMLを生成するコードを使用して

ns2要素を階層全体に渡って定義する必要があります。しかし今では文字列形式でこれを持っているので、簡単にString.Replace()を使用して削除すると、必要なものが得られます。

これは洗練されたソリューションだとは言えませんが、XMLを作成する非標準の方法ではうまくいくはずです。

+0

有望に見える、私は見るためのテストを作成します。 –

+0

ルート要素を追加しました。これは許可されません。ルート要素は '

+0

http://msdn.microsoft.com/en-us/library/bb387075のリンクのいくつかの同様の例を見ることができます。 aspxが、

関連する問題