WhyNamespaceManagerdoesnotuseDefaultNamespacewhenprefix在XPath中当我想使用XPath遍历我的XmlDocument时,我遇到很多Ugly命名空间问题,所以我开始使用NamespaceManager和XPath。XML现在看起来像这个数据,根据我在本文档中看到的内容,“urn:schemas-microsoft-com:office:spreadsheet”是默认命名空间,因为它位于根元素上。所以,天真地,我像这样配置我的NamespaceManager:XmlDocumentdocument=newXmlDocument();文档.加载(阅读器);XmlNamespaceManagermanager=newXmlNamespaceManager(document.NameTable);manager.AddNamespace(String.Empty,"urn:schemas-microsoft-com:office:spreadsheet");manager.AddNamespace("o","urn:schemas-microsoft-com:office:office");manager.AddNamespace("x","urn:schemas-microsoft-com:office:excel");manager.AddNamespace("ss","urn:schemas-microsoft-com:office:spreadsheet");manager.AddNamespace("html","http://www.w3.org/TR/REC-html40");但是,当我尝试使用foreach(XmlNoderowindocument.SelectNodes("/Workbook/Worksheet[1]/Table/Row",manager))访问节点时,我从未得到任何结果。我的印象是,通过将第一个命名空间设置为空前缀,在该工作区中搜索节点时不需要设置它。但是,如AddNamespace方法中所述:如果XPath表达式不包含前缀,则命名空间统一资源标识符(URI)被假定为空命名空间。这是为什么?而且,更重要的是:如果我在不使用前缀的情况下将它们设置为空命名空间,我如何访问默认命名空间中的节点?如果在搜索节点时我什至无法访问它,那么在管理器上设置默认命名空间有什么好处?@JLRishe的答案对于访问默认命名空间中的节点是正确的(即始终将前缀映射到XmlNamespaceManager的默认命名空间)。从参考资料(MSDNXmlNamespaceManager.AddNamespace)中读取链接的整个上下文,声明在XPath表达式中不使用默认的“空”前缀。prefix类型:System.String与要添加的命名空间关联的前缀。使用String.Empty添加默认命名空间。>请注意,如果XmlNamespaceManager将用于解析XML路径语言(XPath)表达式中的命名空间,则必须指定前缀。如果XPath表达式不包含前缀,则命名空间统一资源标识符(URI)被假定为空命名空间。有关XPath表达式和XmlNamespaceManager的详细信息,请参阅XmlNode.SelectNodes和XPathExpression.SetContext方法。来自XPath1.0规范:将节点测试中的QName扩展为扩展,使用表达式上下文中的名称空间声明。这与在开始和结束标记中扩展元素类型名称的方式相同,只是不使用xmlns声明的默认命名空间:如果QName没有前缀,则命名空间URI为null(这与该属性的方式相同)名称是扩展名)。如果QName的前缀在表达式上下文中没有命名空间声明,则会出错。所以这不是关于NamespaceManager的问题,而是定义XPath的工作方式。您缺少的一点是您在NamespaceManager中使用的前缀不必与XML文档中的前缀相似。如果需要,为urn:schemas-microsoft-com:office:excel使用xcel前缀,为urn:schemas-microsoft-com:office:excelxcelurn:schemas-microsoft-com:office:spreadsheet使用sp前缀。您实际上已经在命名空间管理器中为该URN分配了一个前缀,因此您可以使用它:foreach(XmlNoderowindocument.SelectNodes("/ss:Workbook/ss:Worksheet[1]/ss:Table/ss:Row",manager))关于这个问题:如果在搜索节点时我什至无法访问它,那么在管理器上设置默认名称空间有什么用?好处是XmlNamespaceManager用于评估XPath。例如,它可用于跟踪XML文档中的名称空间,其中有默认名称空间的概念。我无法回答您的最后一个问题(“...的好处是什么”),除非它在非XPath情况下可能有所帮助。但是关于“如果默认命名空间中的节点设置为空命名空间而不使用前缀,我该如何访问这些节点?”,答案是您必须使用前缀。所以在这种情况下,由于您声明前缀ss绑定到名称空间urn:schemas-microsoft-com:office:spreadsheet与URIurn:schemas-microsoft-com:office:spreadsheet,它不同于名为的默认名称空间空格是一样的,所以你可以只使用ss前缀。您的XPath表达式:foreach(XmlNoderowindocument.SelectNodes("/ss:Workbook/ss:Worksheet[1]/ss:Table/ss:Row",manager))我发现如果删除默认命名空间xmlns="urn:schemas-microsoft-com:office:spreadsheet"或xmlns=""使默认命名空间为null使用XPath搜索时,您无需在“没有命名空间的元素”之前将命名空间添加到XPath。那么,默认命名空间声明真的重要吗?如果没有,我可能会删除默认的名称空间声明,这使得使用XPath进行搜索更加容易,因为不需要像往常一样添加名称空间。我尝试过的另一种方法是添加一个名为“default”的默认命名空间,这是我自己给出的,我编写了一个自动将“default”添加到没有其他命名空间的元素的方法:publicstaticstringXPathAddDeafultNameSpaceProccess(thisstringXPathProcess){string[]XPSplit=XPathProcess.Split('/');for(inti=0;iitcanturnAA/XX:cc/DD/HH:GG/BB"to"default:AA/XX:CC/Default:DD/HH:GG/Default:BB"以上是C#学习教程:NamespaceManager在XPath中不使用前缀,为什么不使用DefaultNamespace?所有内容分享,如果对大家有用,需要了解更多关于C#学习教程,希望大家多加关注————本文收集自网络,不代表立场,如涉及侵权,请点击右下角联系管理员删除,如需转载请注明出处:
