2014-01-10 74 views
0

我有XML,我需要解析哪些將在層次結構的每個層次上都是非常分層的並且有很多選項。解析非常分層的XML

的XML的樣品低於:

<Maplet MapletName="house" SizeX="15" SizeY="11" Tiled="true" TileID="4" Walled="true" WindowProbability="20"> 
    <MapletContents> 
    <MapletContentsItem Position="Sides" ItemID="37" ItemCategory="mundaneitems" MaxAmount="2" ProbabilityPercentage="75" /> 
    <MapletContentsMaplet Position="Middle" MaxAmount="2" ProbabilityPercentage="100"> 
     <Maplet MapletName="Chairs" SizeX="3" SizeY="3" Tiled="false" Walled="false"> 
     <MapletContents> 
      <MapletContentsItemTag Position="Fixed" x="1" y="1" Category="mundaneitems" MaxAmount="1" ProbabilityPercentage="100" Tag="table"/> 
     </MapletContents> 
     </Maplet> 
    </MapletContentsMaplet> 
    </MapletContents> 
</Maplet> 

你可以從結構看,「MapletContentsMaplet」包含「Maplets」,所以XML可以很容易地將一個內含子maplets更大。

最後,我將要創建一個具有這個確切層次的C#對象。

我已經看了一遍TON的XML解析問題,除了仍然在解析XML的各種類之間感到困惑之外 - 我所聽到的解決方案對於'語言'聽起來非常笨重設計爲地域性的。

的解決方案,我有如下:

  1. 開始在節點
  2. 解析屬性
  3. 轉到第N個孩子和解析屬性/創建對象的要求
  4. 如果第N個孩子有自己的孩子,以孩子爲重點,重複爲1。

這聽起來像是一噸半的工作。我錯過了明顯的東西嗎?

編輯 - 我不知道層次結構會如何「深入」,孩子可能是多種可能的「類型」中的任何一種,所以我不能真正使用'搜索'使用DOM符號或隨你。

+0

這個解決方案對我來說似乎很好。 –

+0

如果你要使用對象,那麼你想要下去的路線是序列化。如果你沒有錯,xml將是透明的 –

+0

不確定你的意思是「語言設計是分層的」0 – BartoszKP

回答

0

鑑於您的對象將具有與xml相同的層次結構,因此我將簡單地使用帶有泛型類型的XMLSerializer類。

public static T Deserialize<T>(string xml) 
{ 
    var serializer = new XmlSerializer(Typeof(T)); 
    using(var textReader = new XMLTextReader(newStringReader(xml))) 
    { 
    return (T)serializer.Deserialize(xmlReader); 
    } 
}