2014-03-04 43 views
-5

我试图解析XML,并分配给对象:通过移动到每个节点类型解析XML文档

XML文件:

<plist version="1.0"> 
<array> 
<dict> 
    <key>SubTitle</key> 
    <array> 
     <dict> 
      <key>IDs</key> 
      <array> 
       <string>CD1</string> 
       <string>CD2</string> 
       <string>CD3</string> 
      </array> 
      <key>Title</key> 
      <string>Data One</string> 
      <key>ABC</key> 
      <string></string> 
      <key>XYZ</key> 
      <string></string> 
      <key>HasLessons</key> 
      <true/> 
     </dict> 
     <dict> 
      <key>IDs</key> 
      <array> 
       <string>DDC1</string> 
       <string>DDC2</string> 
       <string>DDC3</string> 
      </array> 
      <key>Title</key> 
      <string>Data Two</string> 
      <key>ABC</key> 
      <string></string> 
      <key>XYZ</key> 
      <string></string> 
      <key>HasLessons</key> 
      <true/> 
     </dict> 
    </array> 
    <key>MainTitle</key> 
    <string>Collection of Data</string> 
</dict> 
</array> 
</plist> 

我试图解析如下:

XDocument doc = XDocument.Load(FileName); 
      XElement plist = doc.Element("plist"); 
      XElement array = plist.Element("array"); 

      int topicID = 0; 
      Topic topic = new Topic(); 

      String keyValue = String.Empty; 

      topicCollection = new List<Topic>(); 

      using (XmlReader reader = array.CreateReader()) 
      { 
       reader.MoveToContent(); 
       while (reader.Read()) 
       { 
        if (reader.NodeType == XmlNodeType.Element) 
        { 
         if (reader.Name == "dict") 
         { 
          topicID++; 
          topic = new Topic(); 
          topic.TopicID = topicID; 
          topicCollection.Add(topic); 
         } 
         else if (reader.Name == "key") 
         { 
          if (!reader.Read()) 
          { 
           break; 
          } 
          else if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) 
          { 
           keyValue = reader.Value; 
          } 
         } 
         else if (reader.Name == "string") 
         { 
          if (!reader.Read()) 
          { 
           break; 
          } 
          else if (topic != null && reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) 
          { 
           switch (keyValue) 
           { 
            case "Title": 
             topic.SubTitle = reader.Value; 
             break; 
            case "IDs": 
             topic.FileNames.Add(reader.Value); 
             break; 
            case "ABC": 
             topic.ABC = int.Parse(reader.Value); 
             break; 
            case "XYZ": 
             topic.XYZ = reader.Value; 
             break; 
            case "MainTitle": 
             topic.MainTitle = reader.Value; 
             break; 
            default: 
             break; 
           } 
          } 
         } 
        } 
        else if (reader.NodeType == XmlNodeType.EndElement) 
        { 
         if (reader.Name == "dict" && topic != null) 
         { 
         } 
        } 
       } 

      } 

我在这里做错了什么? 我试图在第一个屏幕中显示所有主标题,然后点击每个主标题显示字幕列表并点击每个字幕显示的ID标题列表。

+2

另请参阅http://stackoverflow.com/questions/22146447/linq-to-xml-with-nested-dictionary-and-array和http://stackoverflow.com/questions/22156794/xml-parsing-with -dictionarystring-listmyobject –

+2

只是想知道 - 为什么你正在创建XDocument,但使用XmlReader?甚至更有趣的问题 - 为什么你不使用你昨天问的问题解决方案http://stackoverflow.com/questions/22156794/xml-parsing-with-dictionarystring-listmyobject –

+0

@SergeyBerezovskiy我很抱歉地说,但是当我试图打印的值不打印任何东西,而且我想这是我试图达到结果 – user3114009

回答

0

而不是解析XML必须考虑使用序列化..你有一个类的数据成员对应于你的XML中的节点,然后一旦完成,你可以简单地将你的XML序列化到对象并在你的代码中使用它? 存在一个专用的XML序列化程序,可用于此目的。如果你想控制你如何序列化,那么你也可以使用ISearizable接口。