XmlReader跳过元素
问题描述:
我有以下代码从大型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>
答
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();
}
}
}
}
请注意,如果您有嵌套在其他节点活动的最终将作为父节点的一部分,而不是活动节点作为单独的节点拉出。
您是否有一些示例XML可用于显示行为? – Sjips 2014-11-06 19:30:41
它不会跳过你发布的XML的任何元素......你可以发布一个例子吗? – 2014-11-06 19:52:37
@ThomasLevesque我能够用xml重建节点之间没有空白空间。 – juharr 2014-11-06 19:57:01