2014-02-24 71 views
1

我这种格式有一个plist中:解析内层标签

<plist version="1.0"> 
<array> 
    <dict> 
     <key>Title</key> 
     <string>Chapters</string> 
     <key>Items</key> 
     <array> 
      <dict> 
       <key>Title</key> 
       <string>XYZ</string> 

      </dict> 
      <dict> 
       <key>Title</key> 
       <string>ABC</string> 

      </dict> 
       </array> 
    </dict> 
    <dict> 
     <key>Title</key> 
     <string>ChaptersONE</string> 
     <key>Items</key> 
     <array> 
      <dict> 
       <key>Title</key> 
       <string>ASDF</string> 

      </dict> 
       </array> 
    </dict> 
</array> 

我有一个字符串和列表中的一个类别章类:

我需要这样的: 章节包含列表副标题像XYZ和ABC等... ChaptersONE包含ASDF一样副主题列表等等...

现在,我已经尝试过这样的:

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

Chapters chapters = null; 
String keyValue = String.Empty; 

chapters.listOfItems = new List<Chapters>(); 

using (XmlReader reader = array.CreateReader()) 
{ 
    reader.MoveToContent(); 
    while (reader.Read()) 
    { 
     if (reader.NodeType == XmlNodeType.Element) 
     { 
      if (reader.Name == "dict") 
      { 
       chapters = new Chapters(); 
       listOfItems.Add(chapters); 
      } 
      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 (highwayCode != null && reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) 
       { 
        switch (keyValue) 
        { 
         case "Title": 
          chapters.Header = reader.Value; 
          break; 
         case "Items": 
          break; 
         default: 
          break; 
        } 
       } 
      } 
     } 
    } 
} 

但我所有的主标题(像章和ChaptersOne头),还有子主题只是分配给字符串,我在这里做错了什么?

如何解决这个问题?

编辑 章节应该包含像XYZ和ABC副主题列表等等... ChaptersONE应该包含ASDF一样副主题列表等等...

+0

你的问题不清楚。你的课怎么看?预期的输出如何?什么是'highwayCode'? – MarcinJuraszek

+0

另外,为什么你需要使用'基于XmlReader'的代码而不是基本的Linq-to-Xml? –

+0

请参阅我的编辑家伙 – user2056563

回答

1

是的,有一个简单的方法:

XDocument doc = XDocument.Load("input.xml");// plist file name 

var chapters = (from d in doc.Root.Element("array").Elements("dict") 
       select new Chapter 
       { 
        Title = (string)d.Element("string"), 
        SubTitles = d.Element("array") 
           .Elements("dict") 
           .Elements("string") 
           .Select(s => (string)s) 
           .ToList() 
       }).ToList(); 

你没有显示你的班,所以我认为它看起来像这样:

class Chapter 
{ 
    public string Title { get; set; } 
    public List<string> SubTitles { get; set; } 
} 
+0

好吧,我会尝试,并让你知道 – user2056563

+0

我这里有一个问题,标题也是一个项目列表,SubTitles也是一个列表,所以如何检查它的正确性,我的意思是打印它的值,? – user2056563

+0

我不知道你在说什么... – MarcinJuraszek