c# - XmlReader 跳过元素

标签 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>

最佳答案

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

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

关于c# - XmlReader 跳过元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26787765/

相关文章:

c# - Unity - 将 Leped 位置反转回原始位置

java - 解码 xacml 响应时出错?

java - Android 抽屉式导航错误

c# - 将属性添加到 XML 文件 Linq C#

c# - 很多 catch block ,但它们都具有相同的功能

c# - 多个组件 - 性能损失?

java - 将 XML 元素动态插入文本节点

java - Maven - 如何通过命令行为java项目创建pom.xml

c# - 我怎样才能创建一个激活的检查点系统

c# - 如何处理微服务中的表连接