当前位置: 首页 > 编程语言 > C#

无法让XmlDocument.SelectNodes检索我的任何节点?

时间:2023-04-11 02:36:08 C#

无法让XmlDocument.SelectNodes检索我的任何节点?我正在尝试解析XML文档。有问题的文档是AppxManifest文件。示例文档如下所示:jhjjbhhjbAssetsStoreLogo.png6.2.16.2.1文本我尝试这样解析它:varxml=newXmlDocument();xml.Load(我的文件);varmgr=newXmlNamespaceManager(xml.NameTable);mgr.AddNamespace("","http://schemas.microsoft.com/appx/2010/manifest");varnodes=xml.SelectNodes("应用程序");然而,这样做之后,节点将永远不会包含任何内容。加载xml文档时。使用SelectNodes("//*")按预期返回每个节点。我的问题是什么?我还尝试了XPath查询的许多变体,例如但是,似乎没有任何东西可以检索单个节点。理想情况下,我希望该节点包含所有应用程序节点,您必须专门使用xml命名空间来选择它们。考虑"//*[local-name()='Applications']/*[local-name()='Application']"在你的情况下,这段代码也可以正常工作:vardoc=newXmlDocument();doc.LoadXml(xml);varnsmgr=newXmlNamespaceManager(doc.NameTable);nsmgr.AddNamespace("a","http://schemas.microsoft.com/appx/2010/manifest");varnodes=doc.SelectNodes("//a:Applications/a:Application",nsmgr);您需要在NamespaceManager和XPath中为命名空间指定前缀。请注意,前缀不需要匹配除XPath和名称空间管理器之外的任何内容*。varxml=newXmlDocument();xml.Load(我的文件);varmgr=newXmlNamespaceManager(xml.NameTable);mgr.AddNamespace("a","http://schemas.microsoft.com/appx/2010/manifest");mgr.AddNamespace("bar","http://schemas.microsoft.com/developer/appx/2012/build");varnodes=xml.SelectNodes("//a:Applications",mgr);正如其他答案所指出的那样,接受任何命名空间的XPath是另一种选择。*)即在您的特定示例中,有2个命名空间“default”(请注意,默认前缀不同于空命名空间)和“build”。所以当你定义一个命名空间管理器时,你需要为每个命名空间指定一个前缀(如果你需要在两个命名空间中定位节点),但是前缀可以是任何字符串(前缀有效但不能为空)。也就是说,使用“a”作为“默认”命名空间,使用“bar”作为映射到XML中“build”的命名空间。您可能想阅读此内容这是您的代码:varxml=newXmlDocument();xml.Load("myXMLFile1.xml");varmgr=newXmlNamespaceManager(xml.NameTable);mgr.AddNamespace("","http://schemas.microsoft.com/appx/2010/manifest");XmlNoderoot=xml.DocumentElement;varnodes=root.SelectNodes("//*[local-name()='Applications']/*[local-name()='Application']");不是在这种特殊情况下,但通常情况下,如果实际XML中的名称空间URN与用于将名称空间添加到名称空间管理器的名称空间不完整(例如:缺少尾部斜线),并且具有在XPath中指定的前缀,则查询可能返回null。如果XML中的命名空间URN不可靠,语法“//*[local-name()='tag']”将起作用。以上是C#学习教程:Can'tgetXmlDocument.SelectNodestoretrieveanyofmynodes?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: