XmlDocument.SelectSingleNode为根节点返回null

时间:2009-07-23 03:58:53

标签: c# xml file-extension

我有几个xml文件,其后缀不是.xml,而是.component 现在我想在c#程序中处理它们,但似乎c#甚至找不到这些xml文件的根元素

var doc = new XmlDocument();
doc.Load(path); // MG: edited to Load based on comment
XmlNode root = doc.SelectSingleNode("rootNodename");

似乎根是空的,我该如何处理?

3 个答案:

答案 0 :(得分:5)

鉴于您已经解决了Load / LoadXml混淆,我希望问题是命名空间;你有例子xml吗?处理带命名空间的xml会......“有趣”;-p

例如:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<test xmlns='myFunkyUri' value='abc'/>");
    // wrong; no namespace consideration
    XmlElement root = (XmlElement)doc.SelectSingleNode("test");
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value"));
    // right
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("x", "myFunkyUri"); // x is my alias for myFunkyUri
    root = (XmlElement)doc.SelectSingleNode("x:test", nsmgr);
    Console.WriteLine(root == null ? "(no root)" : root.GetAttribute("value"));

请注意,即使您的xml声明了xml别名,您仍可能需要为命名空间管理器重新声明它们。

答案 1 :(得分:4)

LoadXml采用XML字符串,而不是文件路径。请尝试加载。加载不关心文件扩展名。

以下是Load文档的链接: http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx

答案 2 :(得分:0)

我遇到了这个问题试试这个:在rootNodename前放一个破折号 而不是这个: XmlNode root = doc.SelectSingleNode(“rootNodename”);

这样做: XmlNode root = doc.SelectSingleNode(“/ rootNodename”);