2012-03-18 11 views
2

私はXNAでゲームを作っており、IntermediateSerializerを使ってすべてのレベル情報をXMLに書き込もうとしています。IntermediateSerializerでXML属性を使用する

これまでのところ問題はありませんでしたが、XMLにはタグがあまりにも多くあり、より効率的にしたいと考えています。私は希望

<Asset Type="Data:MapContent"> 
    <Zone>Jungle</Zone> 
    <MapID>Jungle01</MapID> 
    <Size>42 40</Size> 
    <Objects> 
    <MapObject> 
     <Tag>Tree</Tag> 
     <Position>12.10001 1.41174912 9.433376</Position> 
    </MapObject> 
    <MapObject> 
    ... 

はこれに有効にするには::

<Asset Type="Data:MapContent"> 
    <Zone>Jungle</Zone> 
    <MapID>Jungle01</MapID> 
    <Size>42 40</Size> 
    <Objects> 
    <MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject> 
    ... 

これは私がMapObject

[ContentTypeSerializer] 
class MapObjectSerializer : ContentTypeSerializer<MapObject> 
{ 
    protected override void Serialize(IntermediateWriter output, MapObject value, ContentSerializerAttribute format) 
    { 
     output.Xml.WriteAttributeString("Tag", value.Tag); 
     output.WriteObject(value.Position, new ContentSerializerAttribute() { ElementName = "Position", FlattenContent = true }); 
    } 

    protected override MapObject Deserialize(IntermediateReader input, ContentSerializerAttribute format, MapObject existingInstance) 
    { 
     existingInstance.Tag = input.Xml.GetAttribute("Tag"); 
     string[] pos = input.Xml.ReadElementString().Split(' '); 
     existingInstance.Position = new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2])); 
     return existingInstance; 
    } 
} 
のために作ってみましたシリアライザがある

したがって、たとえば、私はこれを持っています

シリアライズ機能が動作しますが、私が必要としていたのと同じXMLが得られますが、Deserializeメソッドは必要ありません。メソッドが呼び出されたときに、XMLパーサがこの位置に既にあるように見えます:

     v 
<MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject> 

は、私は全体MapContentためのシリアライザを記述することなく、「タグ」属性を取得する可能性のある方法はありますか?

他の方法では、属性を使用せずにXMLを効率的にする方法はありますか?

答えて

1

独自のXMLコンテンツパイプライン拡張を書くことができます。 Intermediate Serializerの大きなファンではありません。なぜなら、複雑なXMLがあれば、それはかなり難しいことです。

簡単なガイド

は、ここで見つけることができます: http://roy-t.nl/index.php/2010/08/07/xna-xml-contentimporter/

はそれをやっても、あなたは私の意見で、で動作するように非常に簡単です、あなたのXMLから必要な情報を取得するためにXPathを使用できるようになります。この方法。

それはいくつかの部分が欠けてもよいが、あなたはより完全コンテンツインポーター拡張機能について説明し、このガイドを使用して、それらを補完することができます(とマップをやって!):http://rbwhitaker.wikidot.com/content-pipeline-extension-1

をこれらのルートはオプションでない場合、私はあなたを信じていますあなたのアサーションでは、マップコンテンツ全体のシリアライザを書く必要があるという点で正しいです。

+0

拡張機能を書く価値はあるのかどうか分かりませんが、とにかく見ていきます。他の選択肢については、私はそれが答えになると思った*一息*私はそれが今のままにそれを残すだろうと思う。とにかくありがとう! – Osguima3

関連する問題