2014-11-06 106 views
4

我有以下代码从大型XML文件进行流式传输。但是,某些<Campaign/>元素会被跳过。有什么理由呢?XmlReader跳过元素

public static IEnumerable<XElement> StreamItem(string uri) 
{ 
    using (var reader = XmlReader.Create(uri)) 
    { 
     XElement campaign = null; 

     reader.MoveToContent(); 

     // Loop through <Campaign /> elements 
     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element && reader.Name == "Campaign") 
      { 
       campaign = XNode.ReadFrom(reader) as XElement; 
       yield return campaign; 
      } 
     } 
    } 
} 

更新

该XML文件是公形成,并具有以下的结构。

<CRoot> 
    <Campaign CampaignID="136"> 
     <!-- other nested elements --> 
    </Campaign> 
    <Campaign CampaignID="137"> 
     <!-- other nested elements --> 
    </Campaign> 
    <!-- etc --> 
</CRoot> 
+0

您是否有一些示例XML可用于显示行为? – Sjips 2014-11-06 19:30:41

+0

它不会跳过你发布的XML的任何元素......你可以发布一个例子吗? – 2014-11-06 19:52:37

+0

@ThomasLevesque我能够用xml重建节点之间没有空白空间。 – juharr 2014-11-06 19:57:01

回答

9

XNode.ReadFrom正在推进你的读者到下一个活动开放标签(如果它们之间没有空格)然后reader.Read将前进到该标签的内部文本。你需要在XNode.ReadFrom之后跳过reader.Read这样。

public static IEnumerable<XElement> StreamItem(string uri) 
{ 
    using (var reader = XmlReader.Create(uri)) 
    { 
     XElement campaign = null; 

     reader.MoveToContent(); 

     // Loop through <Campaign /> elements 
     reader.Read(); 
     while (!reader.EOF) 
     { 
      if (reader.NodeType == XmlNodeType.Element && reader.Name == "Campaign") 
      { 
       campaign = XNode.ReadFrom(reader) as XElement; 
       yield return campaign; 
      } 
      else 
      { 
       reader.Read(); 
      } 
     } 
    } 
} 

请注意,如果您有嵌套在其他节点活动的最终将作为父节点的一部分,而不是活动节点作为单独的节点拉出。