的XmlReader跳过元素 [英] XmlReader skips elements

查看:158
本文介绍了的XmlReader跳过元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码从一个大的XML文件流。然而,一些<运动/> 元素被跳过。任何原因

 公共静态的IEnumerable<&的XElement GT; StreamItem(字符串URI)
{
使用(VAR读卡器= XmlReader.Create(URI))
{
的XElement运动= NULL;

reader.MoveToContent();

//循环<运动/>元素
,而(reader.Read())
{
如果(reader.NodeType == XmlNodeType.Element&放大器;&安培; reader.Name ==活动)
{
运动= XNode.ReadFrom(读卡器)作为的XElement;
收益率的回报活动;
}
}
}
}

<强>更新



XML文件格式良好的,并具有以下结构

 < CRoot> 
<运动的CampaignID =136>
<! - 其他嵌套的元素 - >
< /运动>
<运动的CampaignID =137>
<! - 其他嵌套的元素 - >
< /运动>
<! - 等 - >
< / CRoot>


解决方案

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

 公共静态的IEnumerable<&的XElement GT; StreamItem(字符串URI)
{
使用(VAR读卡器= XmlReader.Create(URI))
{
的XElement运动= NULL;

reader.MoveToContent();

//循环<运动/>元件
reader.Read();
,而
{
如果(reader.NodeType == XmlNodeType.Element&放大器;&安培; reader.Name ==运动)(reader.EOF!)
{
运动= XNode.ReadFrom(读卡器)作为的XElement;
收益率的回报活动;
}
,否则
{
reader.Read();
}
}
}
}

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


I have the following code to stream from a large XML file. However, some <Campaign/> elements are skipped. Any reason for this?

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

Update:

The XML file is well-formed and has the following structure.

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

解决方案

XNode.ReadFrom is advancing your reader to the next Campaign open tag (if there is no whitespace between them) then reader.Read will advance to the inner text of that tag. You need to skip the reader.Read after a XNode.ReadFrom like this.

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

Note that if you have Campaign nodes nested in other Campaign nodes those will end up as part of the parent node and not be pulled out as separate nodes.

这篇关于的XmlReader跳过元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆