在我正在处理的应用程序中,有一个XML文档需要加载到内存中进行查询。要做到这一点,我打电话给XmlDocument.Load(string path)
,一直很好。但是,我最近遇到了一些奇怪的行为。
我有一个生成的文件,看起来像这样(编辑删除敏感数据):
*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个条目,而不会输入前2个条目。我已经通过断点确认了这一点,并通过数据调试器。
但是,当我手动重新排列文档中的数据
时*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,那不重要,它只会使代码中缺少的属性无效。此外,没有为任何元素指定名称空间。
这是预期的行为,还是我错过了什么? 如果需要,我可以提供更多细节。
答案 0 :(得分: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对象读取节点的方式存在错误。