【问题标题】:XmlReader skips elementsXmlReader 跳过元素
【发布时间】:2014-11-06 19:25:25
【问题描述】:

我有以下代码可以从大型 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>

【问题讨论】:

  • 您是否有一些示例 XML 可用于显示行为?
  • 它不会跳过您发布的 XML 的任何元素...您能发布一个示例吗?
  • @ThomasLevesque 我能够使用节点之间没有空格的 xml 重新创建。
  • 是的,XML 节点之间没有空格。

标签: c# xml


【解决方案1】:

XNode.ReadFrom 正在将您的阅读器推进到下一个 Campaign 开放标记(如果它们之间没有空格),那么 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 节点中,这些节点最终将成为父节点的一部分,而不是作为单独的节点被拉出。

【讨论】:

  • 这个逻辑流程是我在我的应用程序中缺少的。有很多例子(在 SO 上也是如此),其中 while 循环在检查条件中使用 reader.Read()。这导致我的 XML 解析器例程错过所有其他元素,对我来说重要的修复是确保在我有 switch 块的任何地方都有 else { reader.Read() } 以确定正在处理哪些元素。谢谢!
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-09-25
  • 2019-01-19
相关资源
最近更新 更多