XmlReader跳过元素

时间:2014-11-06 19:25:26

标签: c# xml

我有以下代码从大型XML文件流式传输。但是,会跳过一些<Campaign/>个元素。有什么理由吗?

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>

1 个答案:

答案 0 :(得分:10)

XNode.ReadFrom正在推动您的读者进入下一个广告系列开放标记(如果它们之间没有空格),那么reader.Read将前进到该标记的内部文本。您需要在reader.Read之后跳过XNode.ReadFrom

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();
            }
        }
    }
}

请注意,如果您将Campaign节点嵌套在其他Campaign节点中,那么这些节点将最终作为父节点的一部分,而不会作为单独的节点拉出。