2011-11-15 10 views
3

ウェイポイントを使用してウェイポイントを生成しようとしています。ユーザーがウェイポイント&のパスデータをGUI経由で作成することができます。& XMLファイルに出力します。私は組み込みのc#XMLシリアル化機能を利用することを選択しましたが、クライアントが要求する方法でXML出力をフォーマットすることができませんでした。XMLシリアル化とC#&windowsフォーム

Aには、次のようになり、ウェイポイントデータオブジェクトのバージョンを剥奪:

// Waypoint data class 
[XmlRoot("RootNode")] 
public class WaypointProjectData 
{ 
    [XmlElement("Map")]   // Also tried to use XmlElementAttribute, 
    [XmlAttribute("file")]   // XmlAttributeAttribute, and many variations 
            // of these qualifiers, with no success 
    public string  m_szMapImageFileName; 

    [XmlAttribute("width")] 
    public int   m_iWidth; 

    [XmlAttribute("height")] 
    public int   m_iHeight; 

    [XmlArray("Nodes")] 
    public ArrayList m_aoNodes; 

    WaypointProjectData() 
    { 
     m_szMapImageFileName = "map.png"; 
     m_aoNodes = new ArrayList(); 
    } 
} 

クライアントがXML出力は次のようなレイアウト/フォーマットに準拠している必要があります

<RootNode> 
    <Map file="map.png" width="100" height="100" /> 
    <OtherData var="variable" data="10" /> 
    <Nodes> 
    <Node x="10" y="30" /> 
    <Node x="30" y="20" /> // etc... 
    </Nodes> 
</RootNode> 

いくつかの明確なc#xmlのシリアライゼーションを使用してこれを行う方法の例は非常に役に立ちます。ありがとう!

+0

どの部分は機能しませんか? – BrokenGlass

+0

XmlElementまたはXmlAttributeノードを使用できますが、特定のプロパティで両方を使用することはできません。おそらく、必要なXmlNodeごとに1つのオブジェクトを作成し、その要素の属性にマップし、XML結果を自分でマージしますか? –

+0

[XmlElement( "Map")]をコメントアウトすると、ファイル文字列、widthおよびheightのデータはすべてルートノードの属性として追加されます。また、[XmlAttribute( "file")]をコメントアウトする場合、ファイル文字列はルートノードの後の要素タグ内に配置されますが、幅と高さはルートノードの属性として配置されます。 – GameDev

答えて

0

殴られたトラックのシリアライズを解除するとすぐに、巨大なPIAです。 マップとしてマークアップする何か、おそらくOtherDataも必要です。つまり、ノードに対応するクラスまたは構造体が必要です。例: クラスマップとしてのWaypointProejctdataは、ファイル名、幅、高さのプロパティを持ちます。 私の一般的な経験則は、xmlを取得するためにオブジェクトを乱用しなければならないとすぐに、シリアライゼーションがbinnedになり、XmlReaderまたはWriterを実装して実装するインターフェイスを追加します。 シリアライゼーションをしようとすると、通常はコードを実行するよりもはるかに分かりやすくなります。

1

このような特定のXml形式で何かをシリアル化する必要がある場合は、まずスキーマ(必要に応じて推測され、既知の場合は手作り)から始めます。次に、VS xsdツールを使用してシリアライゼーションクラスを作成します(xsdを推論スキーマの部分に使用できることはわかっています)。—私はその目的のために気にしません。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="RootNode"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Map"> 
        <xs:complexType> 
         <xs:attribute name="file" type="xs:string"/> 
         <xs:attribute name="width" type="xs:decimal"/> 
         <xs:attribute name="height" type="xs:decimal"/> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="OtherData"> 
        <xs:complexType> 
         <xs:attribute name="var" type="xs:string"/> 
         <xs:attribute name="data" type="xs:decimal"/> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="Nodes" minOccurs="0"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="Node" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:attribute name="x" type="xs:decimal"/> 
            <xs:attribute name="y" type="xs:decimal"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
:あなたはあなたの例から作成されたこのようなXSDファイルを持っている場合

だから(私はできるだけ—このようなデータ型を指定されたプロパティに適切な型を使用するのxsdツールを助けることに注意してください)あなたはこのRoot.xsdに名前を付ける場合は

、あなたはVSコマンドラインに移動し、

XSD Root.xsd/C /n:myProject.Xml

そのクラスファイルを作成します(名前付きルートを実行することができますこれはルートを処理するときのデフォルトのためです。 XMLをシリアライズしてデシリアライズするために.Netに簡単にプラグインできるオブジェクトが含まれています。クラスが持つ名前空間( "/n:myProject.Xml")を指定しました。私はその名前空間を制御する方が好きですが、デフォルトでは普通は残りの部分がうまくいきます。さらに、ツールは部分的なクラスを作成するので、カスタムのプロパティアクセサを必要とする場合は、ツールを再度実行する必要がある場合にクリームにならない別のファイルに追加することもできます。

別のヒント、私は "< xsd名> xsdコマンドライン"という名前のプロジェクトにテキストファイルを作成します。そうすれば、私はそれをVSコマンドラインに貼り付けるだけで、私が使用した他のすべてを覚える必要はありません。

+0

私はこの回答をするのに尽力したことに感謝しますが、本当に私の質問には答えません。クライアントのソフトウェアと互換性があるように、ウェイポイントジェネレータからのファイル出力に従わなければならない特定のレイアウトがあります。上記の例は、その形式からかなり離れているだけでなく、出力を作成するために使用されたC#実装の例です。しかし、応答に感謝します。 – GameDev

+0

そのスキーマをxsdにコピーし、VS xsdツールを実行すると、探しているものが正確に得られます。つまり、出力を作成するために使用されたc#実装の例です。私はそれがかなり明確だと思った。実際に自動生成されたコードは含まれていませんでした。あなたが本当に望む結果を得るには、それを自分で調整したいと思ったからです。結局のところ、誰も本当に "var"と "data"の属性を持つ "OtherData"というノードを望んでいません。 –

+0

ああ、おっと。私はあなたの投稿を誤解して、自分のジェネレータの出力を1つの(スキーマ)形式にしてから、そのファイルを目的の形式に変換しました。説明をありがとう。 私はVS xsd/schemaツールの周りに突っ込んで、私が思いつくものを見ていきます。 – GameDev