2012-06-04 270 views
1

在我正在处理的应用程序中,需要将一个XML文档加载到内存中进行查询。要做到这一点,我打电话XmlDocument.Load(string path),这一直工作正常。不过,我最近遇到了一些奇怪的行为。XmlDocument.Load忽略元素?

我有一个生成的文件看起来像这样(编辑删除敏感数据):

*Snip* 
<Info name="name2" parent="name1" modifier="A"/> 
<Info name="name2" parent="name1" modifier="B"/> 
<Info name="name1" modifier="A"/> 
<Info name="name1" modifier="B"/> 
<Info name="name3" parent="name2" modifier="A"/> 
<Info name="name3" parent="name2" modifier="B"/> 
*Snip* 

上面有六个条目。但是,如果调用XmlDocument.Load,则只加载4个条目,而将前两个条目排除。我已经通过断点确认了这一点,并通过了数据调试器。

然而,当我手动重新排列文件中的数据是

*Snip* 
<Info name="name1" modifier="A"/> 
<Info name="name1" modifier="B"/> 
<Info name="name2" parent="name1" modifier="A"/> 
<Info name="name2" parent="name1" modifier="B"/> 
<Info name="name3" parent="name2" modifier="A"/> 
<Info name="name3" parent="name2" modifier="B"/> 
*Snip* 

的所有数据被正确地加载,没有元件被排除在外。 据我所知,文档格式良好,加载时没有抛出异常。还应该注意的是,当我为所有条目人为地添加一个parent属性时,它们都会正确加载,但是如果我正确理解了XML,那就没有关系,它只会使代码中缺失的属性无效。此外,没有为任何元素指定名称空间。

这是预期的行为,还是我错过了什么? 如果需要,我可以提供更多细节。

回答

1

我只是想你的例子这样:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<root><Info name=\"name2\" parent=\"name1\" modifier=\"A\"/><Info name=\"name2\" parent=\"name1\" modifier=\"B\"/><Info name=\"name1\" modifier=\"A\"/><Info name=\"name1\" modifier=\"B\"/><Info name=\"name3\" parent=\"name2\" modifier=\"A\"/><Info name=\"name3\" parent=\"name2\" modifier=\"B\"/></root>"); 
int count = doc.SelectNodes("//root/Info").Count; 

它工作得很好。它返回值6,这是正确的数字。自己尝试一下。如果它不适合你,那么你的安装必须有一些棘手的问题。但是,如果我怀疑它的确如此,那么问题一定是别的。

尝试从小的开始,并增加更多的复杂性,直到失败。要么是导致它的XML有其他错误,要么是从XmlDocument对象读取节点的方式存在错误。

+0

原来你是对的,在别处有一个不相关的方法是删除节点。我使用你的代码来发现差异。谢谢! –